Aide pour création forcée d'un fichier txt (et écriture)...

Signaler
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007
-
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005
-
De la même façon que pour "forcer" l'affichage d'un printf() ou d'un cout << "texte_à_afficher", il faut utiliser un "flush" (cout << "texte_à_afficher" << flush;), comment force-t-on la création d'un fichier txt et l'écriture dans ce fichier?

Car mon prog utilise une grande boucle principale qui met plusieurs semaines avant d'aboutir. A chaque tour de boucle, un résultat doit être inscrit dans un fichier txt. Malheureusement, ce fichier txt n'est créé et rempli qu'une seule fois à la fin de la boucle (tous les résultats sont alors inscrits d'un coup). C'est très embêtant... Comment y remédier?

Merci!

8 réponses

Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
la fonction _commit flush un fichier sur le disque, je pense que ça devrait t'aller!

>>Info de MSDN:
The _commit function forces the operating system to write the file associated with handle to disk. This call ensures that the specified file is flushed immediately, not at the operating system?s discretion.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt__commit.asp
[mailto:julienbj@hotmail.com Savon]
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Si tu tournes sur Windows:
WriteFile() avec 0 en dernier param assure la synchro.

ciao...
BruNews, MVP VC++
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Ca correspond a quoi exactement ces synchro d'ecriture de fichier et ces forcages d'écriture ?
Dans quel cas faire cela ?

Shell
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
En API:
si tu fournis une struct OVERLAPPED en param de WriteFile et que fichier ouvert avec flag FILE_FLAG_OVERLAPPED, ton code se poursuit sans attendre et tu es prevenu par l'event de la structure de la fin de l'operation d'ecriture.

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
WriteFile() ecrit bien illico si on passe 0 en dernier param et rend la main quand c'est fait.

j'ai du enlevre le dernier post pour cause d'erreur d'indexation, pas de la censure je precise bien, desole.

ciao...
BruNews, MVP VC++
Messages postés
48
Date d'inscription
lundi 29 novembre 2004
Statut
Membre
Dernière intervention
16 mars 2005

Si tu utilise Unix/Linux:
Ouvres ton fichier avec la fonction open() le flag O_SYNC . En principe l'ecriture synchrone sur le disque est assuree. Il peut cependant y avoir des restrictions. J'ai eu , dans le passe, ce genre de probleme et ne put le resoudre qu'en faisant un close du fichier apres ecriture.

Bien entendu nbe pas utiliser fopen() qui travaille exclusivement en cache et laisse l'OS se charger des IO disque.

Yves
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007

Merci à tous pour vos idées et infos. Je vais tester tout ça et je vous tiens au courant.

Je travaille sous Windows. Voici ma fonction Ecrire que j'appelle à chaque tour de boucle :

void Ecrire(ZZ p)
{
ofstream Fichier("résultats intermédiaires.doc");
Fichier << p;
Fichier.close;
}

NOTE : j'utilise des nombres de classe ZZ (très grands entiers de plusieurs centaines de milliers de chiffres) et c'est eux que je voudrais inscrire au fur et à mesure dans un fichier, à chaque tour de boucle...

Si vous avez des idées, merci de les illustrer par un exemple concret (une petite ligne de code) car je ne suis pas très expérimenté et je n'ai suivi aucune formation théorique...
Merci! :)
Messages postés
232
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
8 janvier 2005

Pourquoi pas ça ? ofstream dérive de ostream
void Ecrire(const ZZ& p)
{
ofstream Fichier("résultats intermédiaires.doc");
Fichier << p << flush;
// Fichier.close(); // pas obligatoire, le destructeur le ferme.
}