Ecrire dans un file a un endroit precis

Messages postés
2
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 août 2004
- - Dernière réponse : BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- 12 août 2004 à 13:36
je suis debutante en vc++ et j'essaye d'ecrire un prog pour ecrire ds un fichier texte a un endroit precis.
si une ame genereuse n'aurait pas par hasard ecrit un code similaire ne pourrait pas me l'envoyer afin que je puisse m'en inspirer.Merci de tout coeur.
Afficher la suite 

20/23 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
CreateFile pour ouvrir.
SetFilePointer pour placer.
WriteFile pour ecrire.

Gaffe que tu vas ecraser ce qui s'y trouvera et surtout ne pas chercher a pointer au dela de la fin du fichier sinon badaboum.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
0
Merci
tu aurais bien une fonction du genre mais si tu precise ta question, cela va de sois, tu auras une reponse plus precise.

Globalement ca pourrais etre un truc de ce genre:

#include <stdio.h>

char EcritDansFichier(char *szFileName, const char *szString, long lPosition)
{
FILE *hFile; // handle du fichier

hFile = NULL;

// On ouvre le fichier en ecriture
hFile = fopen( szFileName, "w" );

// Si le fichier n'est pas ouvert: on sort...
if( !hFile )
return -1;

// Protection si la position est negative:
if( lPosition < 0 )
{
// On ferme le fichier
fclose( hFile );

// On sort avec un code d'erreur
return -1;
}

// fseek sert a se positionner dans un fichier
fseek( hFile, lPosition, SEEK_SET );

// On ecrit la chaine
fputs( hFile, szString );

// On ferme le fichier
fclose( hFile );

// On sort avec un code de success
return 1;
}

Remarques importantes:

(1) Si la fonction est appellee plusieurs fois, seule la chaine du dernier appel sera dans le fichier. Dans le cas ou tu voudrais ajouter il faut ouvrir le fichier en mode append.

(2) Si tu tiens compte de la remarque (1) et que donc tu veux appeller plusieurs fois la fonction, les chaines ecrites ne seront pas ecrite avec un retour a la ligne.
Commenter la réponse de DevGizmo
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Dans vc++ on compile pour Windows qui considere maree et autres flux comme obsoletes, on se servira donc de API et on gagne vitesse + 8 Ko d'exe a ne pas inclure stdio.h.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
0
Merci
BruNews: je trouve tes reponses tres pertinentes, le seul probleme, c'est qu'etant donne que taliaw est debutante; je pense mais en tout bien tout honneur que tu aurais au moins pu prendre tout comme moi..., le temps d'ecrire une petite fonction lui montrant l'utilisation de ces zolis api's Windows. D'autre part...les api's dont tu cite le nom, sont branche en interne sur les api's "io" donc aucune difference de vitesse.

ciao...
Fred, Pas Admin, Pas MVP Visual C++
Commenter la réponse de DevGizmo
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Aucune difference de vitesse ? c'est une plaisanterie, on la deja demontre un paquet de fois ici. Comment veux tu qu'une couche d'interpretation comme fputs soit aussi rapide qu'une commande directe driver comme WriteFile.
Des exemples elle en trouvera plein les sources, pas seuilement les miennes (voir ymca2003 et d'autres).
Il faut donner toutes les pistes mais leur laisser aussi un travail de recherche, ça s'encrera bien mieux ainsi.
Richter documente tout cela avec exemples:
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
0
Merci
taliaw si tu ve un exemple simple d'emploi

j'ai créer une bibli BFichierTxt

regarde mes premieres sources sur ce site

exemple d'emploi:

creeFicHello()
{
  BFichierTxt fic("c:\\monChemin\\monFichier.txt","w");
  fic+="hello";
}


et tu auras un fichier comportant la chaine hello

voila, y a tjs moyen d'augmenter la vitesse etc, mais je préfère d'abord les bibliothèques simples d'emploi

Magic Nono: l'informagicien!

PS: d'aucun préciseront que mes bibli ne sont pas si simple car elles nécessites d'autres inclusions.... C normal, je pratique un développement modulaire
je répondrai alors de télécharger un de mes projets complet comportant les bibli en question et tout ce qui est nécessaire sera en votre possession

++
Commenter la réponse de magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
0
Merci
au fait fopen (ou BFichier)
s'emploi avec "a" en 2e param pour les maj

Magic Nono: l'informagicien!
Commenter la réponse de magic_Nono
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
magic_Nono > en quoi ce sera plus simple que les APIs de fichier qui sont vraiment 'plus con tu meurs', je peux comprendre une bibli 3D ou ce genre de chose, mais la vraiment a part grossir exe et ralentir, je ne cerne toujours pas le but.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
0
Merci
hello

là ou nous différons BruNews, C que je préfère un prg faisant 3000 verif meme en double et très stable

à de l'assembleur ou tu aurai virer toutes ces verif que tu qualifie d'inutiles car vu que tu programme "bien" et surtout depuis lgt, tu ne fait pas un certain nombre d'erreur que je préfère vérifier & au besoin signaler...

Dc celles de bases ne sont pas si cons que ça et j'utilise les miennes que j'ai sécurisé au fur & a mesure du tps

Dc les miennes sont peut-etre a qualifier de "Pour les Nuls"
mais c'est à mon sens un label de qualité.
Et les tiennes ... pardon, tu n'en as pas, ça ralentit...

ceci dit, les compilos sont là pour optimiser non?

Magicalement

Magic Nono: l'informagicien!

PS : tu n'as pas répondu : comment ferais-tu une hashTable...
Commenter la réponse de magic_Nono
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Mais enfin prenons le cas de ReadFile (WriteFile idem):
DWORD v;

ReadFile(hfl, pdata, nbr, &v, 0);

hfl , handle fichier
pdata , pointeur sur donnees a transferer
nbr , combien d'octets a transferer
&v , adresse qui recevra nbr octets reellement tranferes

Que peut-on faire de plus simple ?

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
0
Merci
ben plutot que du C, du C++

ton code: (probable, je met que l'algo, G oublié tt ces trucs...)
{
fopen....
//CTRL d'err que tt le monde oubli mais qui peut amener d'innombrables bugs
//recherche la position
fseek(...)
//insertion du code
WriteFile(hfl, pdata, nbr, &v, 0); //
fclose(...)
//recontrole !!!
}


ce qui fait au moins 4 ou 5 fonction bas niveau à se taper
a comprendre...
---

mon code

{
BFichierTxt f("toto","a");
f.insertAt(i,"mon Txt a insérer");
}

ce qui fait une classe (dont l'utilisation est quasi instinctive) a utiliser et bien documenté (et en français, s'il vs plait!)

ceci dit, d'accord avec toi, mon code sera plus lent , de qq 1000e de secondes...

pour moi, y a pas photo

PS : insertAt n'existe pas actuellement dans BFichier
=> soluce a ton pb avec mes Bibli (commençant par un B lol)

{
BString fic=BFichierTxt::getContenu(nomFic);
fic.insertAtPos(i,"truc à insérer");
BFichierTxt f(nomFic,"w");
f+=fic;
}


voilu

aliaw> a t'on finalement répondu à ta question???

Magic Nono: l'informagicien!
Commenter la réponse de magic_Nono
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
0
Merci
Je vais le remettre car cela peut etre interessant pour les autres.....!!!!!! Toi qui veux que la communaute profite du savoir des uns et des autres.

#include <windows.h> // pour les z'api's dowdows
#include <stdio.h> // pour les printf
#include <string.h> // pour les strlen
#include <fcntl.h> // pour les constante de la lib io
#include // pour les proto de la lib io
#include <time.h> // pour le bench

#define FILENAME "c:\\testfile.txt"
#define NB_WRITE 100000
#define BUFFER_SIZE 256

char BruNews_Write_Method(char *szFileName, const char *szBuffer)
{
DWORD dwNbWritten = 0;

HANDLE hFile = CreateFile( szFileName,
GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if( hFile == INVALID_HANDLE_VALUE ) return -1;

WriteFile( hFile, (char * )szBuffer, strlen(szBuffer), &dwNbWritten, NULL);

CloseHandle( hFile );

return 1;
}

char Fred_Write_Method(char *szFileName, const char *szBuffer)
{
int uFile = _open( szFileName, _O_WRONLY );

if( !uFile ) return -1;

_write( uFile, (char *)szBuffer, strlen(szBuffer) );

_close( uFile );

return 1;
}

int main(int argc, char* argv[])
{
unsigned long i;
char szBufferTmp[BUFFER_SIZE];
time_t tStartTime;
time_t tEndTime;
double dElapsed;

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

printf("--------------------------------------------------------\n");
time( &tStartTime );

for( i=0; i<NB_WRITE; i++ )
{
sprintf( szBufferTmp, "Chaine no: %ld", i );
BruNews_Write_Method("c:\\testfile.txt", szBufferTmp );
}

time( &tEndTime );
dElapsed = difftime( tEndTime, tStartTime );

printf("Methode BruNews: %f\n", dElapsed );

printf("--------------------------------------------------------\n");

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

printf("--------------------------------------------------------\n");
time( &tStartTime );

for( i=0; i<NB_WRITE; i++ )
{
sprintf( szBufferTmp, "Chaine no: %ld", i );
Fred_Write_Method("c:\\testfile.txt", szBufferTmp );
}

time( &tEndTime );
dElapsed = difftime( tEndTime, tStartTime );

printf("Methode Fred: %f\n", dElapsed );

printf("--------------------------------------------------------\n");

////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////

return 0;
}
Commenter la réponse de DevGizmo
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Ben on pourra noter qu'on est deja passe de 'fputs' a '_write'.

Ceci est un NON test, quasi tout le temps a ete employe par le systeme dans le 1er acces au fichier, deplacement du bras sur le disque.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
0
Merci
mdr comme tu t'y retrouve en supprimant les post,

C un peu draconien je trouve...

mé po grave... l'essentiel de l'info demeure

ceci dit, tu comprends pkoi je veux faire ma table de hash, (éviter ts ces acces disk...)
dc...

TB: c'est plutot cool que le bras ne soit pas rangé à chaque fois,

ceci dit, le test dépend dc aussi de la fragmentation du DD, et des autres processus faisant éventuellt accès simultanément au au DD.

++

Magic Nono: l'informagicien!
Commenter la réponse de magic_Nono
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
0
Merci
Techniquement: les arguments que j'avance sont vrai, pourquoi ne pas le reconnaitre simplement... c'est trop difficile.?
Dire ok tu as raison...et dire les apis windows sont bien et efficace dans certains cas et dans d'autre pas..?? c'est dur a dire ca.???
Je n'ai rien avance sans preuve....

@+
Commenter la réponse de DevGizmo
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Alors on va reprendre le detail.
En incluant on lie son exe a la msvcrt.dll, suffit d'editer le h. Now on va sur la dll et on regarde ses dependances avec depends.exe, on contatera qu'elle en a sur kernel32 et Ntdll, normal. On recommence a regarder les exports de ces 2 DLLs (le noyau), eh ben NENNI _write nulle part. N'existe pour un prog en mode user (non kernel tel un driver) QUE WriteFile pour ecrire, tout autre moyen finit chez cette fonction par une voie plus ou moins detournee.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
0
Merci
Mais je n'ai jamais dit que cela ne passais pas sur kernel32.dll, et c'est normal. Comment veux tu sinon que cela s'ecrive sur le disque... Ca passe par le driver de disque et par le systeme de fichier fat, fat32, ntfs, iso9660 ou autre; de windows. Apres les couche d'abstraction des apis windows et de io sont differentes et c'est pour ca qu'il y a une difference de vitesse....

@+
Commenter la réponse de DevGizmo
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Mais a la fin, qu'est-ce que ce 'io' ? Nous faudrait une explication.
Le systeme detourne les interruptions, on n'accede aux periphs que via son API et pas autrement, donc WriteFile et rien d'autre.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews
Messages postés
122
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
27 février 2007
1
0
Merci
C'est gere de la meme maniere....!!!!!
La seule difference, c'est que le codage de l'api WriteFile est un peu plus gourmand en temps d'execution que le _write de la LIBRAIRIE "IO" qui est plus bas niveau....
C'est clair.???.
Commenter la réponse de DevGizmo
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
Librairie 'io' demeurera donc un element mystique.
Ne touchons pas au sacre, je me retire donc de ce threas.

ciao...
BruNews, Admin CS, MVP Visual C++
Commenter la réponse de BruNews