écrire un fichier

Messages postés
139
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
23 juin 2008
-
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
-
bonjour TOut le MOnde
jai faite un programme de traitement de texte avec dev cpp  et ma question est : Je lance mon programme ... je dit d'écrire dans un fichier .. mais il écrit le fichier quand le programme se ferme et pas quand il devrait l'écrire !
Qu'es qui ce passe?

6 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
ajoutes un flush lorque tu veux qu'il écrive sur le disque dur.


ofstream file(...);

file << "coucou" << flush;


Mais c'est normal qu'il écrive par paquets et non a chaque fois que tu ajoutes un mot ou un caractère.
Messages postés
139
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
23 juin 2008

en C sil te plait ...
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
16
Quand le programme se ferme uniquement? Tu utilise fopen? Si oui, a tu ajouté fclose quand tu as fini avec le fichier? Sinon, c'est sûr qu'il y aura problème.

C++ (@++)
___________________________________________
Les plus grands esprits trouvent toujours une solution<!--
Messages postés
139
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
23 juin 2008

oui jutilise fopen et il y a un close quand j'ai plus besoin d'écrire dans mon fichier je vous passe le code
:
FILE *file;// créé une variable ressource
int temp; //variable temp pour getw
int sizeFile=0; //taille du fichier
int sizeMot=0; //taille du mot a rechercher
char motSeek[100]; //mot a rechercher
char fRead[100]; //fichier lu
int nbFind=0; //nombre de fois trouvé
int i; //pour le for
char fin[100];
file=fopen("C:\\log.txt","rb"); //on ouvre le fichier en binaire

while (!feof(file)) { //on trourne jusqu'a la fin du fichier
temp = getw( file ); //on li le fichier
printf( "%d \n",temp);
sizeFile++; //on incrémente la taille du fichier
}
printf(" %d",sizeFile);
sizeFile = sizeFile *4; //on convertis les bit en octet
printf(" %d",sizeFile);
close(file); // on ferme le fichier

file=fopen("C:\\log.txt", "r"); //on ouvre le fichier en lecture seul


printf("\n\n> Mot recherch%c ? ", 130); //on affiche

gets(motSeek); //on lit le mot qui faut chercher
fflush(stdin); //on vide le buffer du clavier
sizeMot= strlen( motSeek ); //la taille du mot a rechercher

for (i = 0; i <= (sizeFile - sizeMot); i++) { //on tourne

fseek(file,i,0); //on place de pointer sur le fichier avec l'offest de i
fgets(fRead, sizeMot+1, file); // on lit le un mot

if(! ( strcmp(fRead, motSeek) ) ) { //on compare le mot lu et le mot rechercher
nbFind++; // on incrémente

}

}
close(file);
file=fopen("C:\\log2.txt", "w"); //on ouvre le log2.txt en mode écriture
fseek(file,0,0); //on pojnte sur le début du fichier
sprintf(fin, "Nombre de fois trouvé : %d \n", nbFind); //dans f on met nombre de fois trouvé : nbfind
fputs(fin,file); //on écrit dans log2.txt
fflush(stdout);
close(file);
//on vide le buffer du clavier
printf(" %d",nbFind); //on afficher combien de fois trouvé
system("PAUSE");
return 0;
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
18
Je te propose une version qui me semble plus courte, pas forcément plus efficace mais moins il a de lignes, plus les erreurs sont groupées :

// Compte le nombre d'occurences d'un mot dans un fichier
// Un mot est une suite de caractères alphabétiques (a-zA-Z) encadrée par deux caractères parmi
// le debut de fichier, la fin de fichier ou un caractère non-alphabétique
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void usage (char **argv) {
    printf ("Usage : %s MotAChercher FichierSource FichierRésultat\n", **argv);
    exit (EXIT_SUCCESS);
}
void erreur (char *err, char *f) {

    char msg[100];
    sprintf (msg, "%s %s", err, f);
    perror(msg);
    exit (EXIT_FAILURE);
}

int main(int argc, char *argv[]) {

    FILE *f;
    char *mot;    int i 0, occ 0, c;
    char rep[100];

    if ( argc != 4 ) usage(argv);
    if ( !(mot = (char *) malloc (strlen(argv[1]) + 1)) ) { perror("malloc"); exit (EXIT_FAILURE); }
    if ( !strcpy (mot, argv[1]) ) { perror("strcpy"); exit (EXIT_FAILURE); }
    // Ouvrir le fichier source
    if ( !(f = fopen (argv[2], "r")) ) erreur("Problème pour ouvrir en lecture le fichier", argv[2]);   

    // Compter
    while ( ( c = fgetc (f) ) != EOF ) { // c'est long
        if ( !mot[i] && !isalpha(c)  ) { occ++; i = 0; } // Trouvé !        else if ( c !mot[i] ) i 0;
        else i++;
    }

    if ( fclose(f) == EOF ) erreur("Problème pour fermer le fichier", argv[2]);
    // Ouvrir le fichier cible
    if ( !(f = fopen (argv[3], "w")) ) erreur("Problème pour ouvrir en écriture le fichier", argv[3]);   
    sprintf (rep, "Mot '%s' trouvé %d fois dans le fichier %s.\n", mot, occ, argv[2]);
    free(mot);
    if ( fputs(rep, f) == EOF ) { perror("fputs"); exit (EXIT_FAILURE); };
    if ( fclose(f) == EOF ) erreur("Problème pour fermer le fichier", argv[3]);
    // Resultats
    puts(rep);
    // sprintf (rep, "cat %s", argv[3]);
    // system (rep);

    return EXIT_SUCCESS;
}

Si tu veux les accents et d'autres exotismes, tu modifies la condition dans le while pour inclure les caractères que tu veux inclure dans tes mots.
Le debut et la fin c'est du décor, le milieu c'est la partie qui compte.
Messages postés
694
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
8 janvier 2014
18
petite correction :
printf ("Usage : %s MotAChercher FichierSource FichierRésultat\n", *argv);
au lieu de
printf ("Usage : %s MotAChercher FichierSource FichierRésultat\n", **argv);

La version avec deux étoiles provoque une erreur de segmentation en voulant afficher les usages.
Non contente d'insulter l'utilisateur qui se trompe dans les arguments, cette fonction plante le programme pour être sûre qu'il ne bossera pas...