problème de lecture de fichier texte

problème de lecture de fichier texte - C - Programmation

Marsh Posté le 11-06-2004 à 12:25:49    

Bonjour,
J'ai un fichier texte que je lis ligne par ligne à l'aide de fgets. A chaque ligne j'écris "toto" dans un autre fichier. Le problème est qu'une fois le fichier parcouru en entier mon programme semble recommencer à zero et cela indéfiniment, donc j'ai du "toto" à gogo :p
 

Code :
  1. FILE* fichier;
  2.     FILE* fichier2;
  3.     char stringbuf[200];
  4.    
  5.     fichier = fopen("./essai.csv","r" );
  6.     fichier2 = fopen("./marche.csv","a" );
  7.     while(fgets(stringbuf, 200, fichier) != NULL){
  8.         fprintf(fichier2, "%s\n", "toto" );
  9.     }
  10.     fclose(fichier);
  11.     fclose(fichier2);
  12. }


Message édité par mirascheat le 11-06-2004 à 12:26:20
Reply

Marsh Posté le 11-06-2004 à 12:25:49   

Reply

Marsh Posté le 11-06-2004 à 12:37:26    

Code :
  1. FILE* fichier;
  2. FILE* fichier2;
  3. char stringbuf[200];
  4.      
  5. fichier = fopen("./essai.csv","r" );
  6. fichier2 = fopen("./marche.csv","a" );
  7. do{
  8.    
  9.     fprintf(fichier2, "%s\n", "toto" );
  10.     fgets(stringbuf, 200, fichier};
  11. }while(!feof(fichier));
  12. fcloseall();


 
je pense a un truc comme ça.
Essaye si ça marche.
A+


Message édité par bombyce le 11-06-2004 à 13:05:24
Reply

Marsh Posté le 11-06-2004 à 13:27:35    

Bombyce non, tu as tort, tu ferais bien de regarder comment il fait, c'est la bonne méthode

Reply

Marsh Posté le 11-06-2004 à 13:34:00    

Pourquoi ça n'est pas bon ?
Je parcours jusqu'a la fin du fichier en changeant de lignes a chaques fois.Sauf lors du premier traitement car avec un do{...} while ,le code est parcouru au moins une fois. comprend pas ou je merde.
 
Besoin de tes lumieres!  
A+

Reply

Marsh Posté le 11-06-2004 à 13:46:17    

tiens je viens d'essayer le fcloseall() et j'obtiens une erreur : [Linker error] undefined reference to 'fcloseall'.
fcloseall se situe bien dans stdio.h ?

Reply

Marsh Posté le 11-06-2004 à 13:50:37    

oui , j'ai verifie sur un bouquin et c'est bien dans stdio.h

Reply

Marsh Posté le 11-06-2004 à 13:56:57    

D'ou vient cette erreur alors ? sniff

Reply

Marsh Posté le 11-06-2004 à 13:57:04    

ben soit tu sais pas lire, soit ton bouquin est pourri : fcloseall est pas standard et spécifique à certains environnements. par exemple, certains envionnement on décrété que fclose(NULL° fermait tout...

Reply

Marsh Posté le 11-06-2004 à 14:02:24    

du calme, ça fait 3 semaines que je fais du C...je sais presque rien de ce langage; et c'est un livre que l on m'a prete. JE SAIS POURTANT LIRE et c'est ce qu il y a de marque (C'est un aide memoire de C qui date de 1996, edition MARABOUT INFORMATIQUE).  

Reply

Marsh Posté le 11-06-2004 à 14:04:37    

Bombyce a écrit :

du calme, ça fait 3 semaines que je fais du C...je sais presque rien de ce langage; et c'est un livre que l on m'a prete. JE SAIS POURTANT LIRE et c'est ce qu il y a de marque (C'est un aide memoire de C qui date de 1996, edition MARABOUT INFORMATIQUE).


 
Hors du K&R point de salut pauvre mortel :o

Reply

Marsh Posté le 11-06-2004 à 14:04:37   

Reply

Marsh Posté le 11-06-2004 à 14:08:52    

En effet je viens de parcourir le net à la recherche d'info sur ce "Error link" (qui a l'air spécifique à Dev-cpp) ... Bon si quelqu'un connait le standard pour ce compilateur je prends sinon je reste avec mes deux fclose ...
 
edit : et encore une fois merci à Taz, le vainqueur était fclose(NULL)  :lol:


Message édité par mirascheat le 11-06-2004 à 14:11:08
Reply

Marsh Posté le 11-06-2004 à 14:09:56    

gcc 3.3.xxx, norme ANSI, voire C99 smieux
trouve toi un Kernigham & Ritchie a la FNAC et zou

Reply

Marsh Posté le 11-06-2004 à 14:11:28    

:sweat:  pas cool Joel F
 
A+

Reply

Marsh Posté le 11-06-2004 à 14:11:36    

mirascheat a écrit :

En effet je viens de parcourir le net à la recherche d'info sur ce "Error link" (qui a l'air spécifique à Dev-cpp) ... Bon si quelqu'un connait le standard pour ce compilateur je prends sinon je reste avec mes deux fclose ...
 
edit : et encore une fois merci à Taz, le vainqueur était fclose(NULL)  :lol:

fais avec, c'est la seule bonne solution

Reply

Marsh Posté le 11-06-2004 à 14:12:01    

Bombyce a écrit :

:sweat:  pas cool Joel F
 
A+


 
o_O ??,  :heink:

Reply

Marsh Posté le 11-06-2004 à 14:26:48    

Taz a écrit :

fais avec, c'est la seule bonne solution

je parlais pas du fclose(NULL) qui est pas standard : tu vas changer ton programme d'environnement et il marchera pas. franchement je suis sur que tu codes avec les pieds, c'est pas une ligne en plus qui va pourrir ton programme :o

Reply

Marsh Posté le 11-06-2004 à 14:28:27    

bon on fait j'ai une erreur qui fait planter mon soft ... je pensais que c'etait parce que mon fichier était trop gros (cf mon 1er post) mais bon ca ne semble pas être ca, donc je poste mon bout de code ici (l'erreur doit venir au niveau de element parce que c'est depuis que j'ai implémenté cette variable que j'ai des pbs) :

Code :
  1. FILE *fichier, *fichier2;
  2.     char stringbuf[200];
  3.     char *item, *element;
  4. fichier = fopen("./essai.csv","r" );
  5.     fichier2 = fopen("./marche.csv","a" );
  6.     while(fgets(stringbuf, 200, fichier) != NULL){
  7.         strtok(stringbuf, ";" );
  8.         strtok(NULL, ";" );
  9.         element = strtok(NULL, ";" );
  10.         valuee = strtok(NULL, "\0" );
  11.         if(format_type == 0){
  12.             fprintf(fichier2, "%s%s%s\n", "tata", element, valuee);
  13.         }
  14. }
  15.     fclose(NULL);
  16.    
  17. }

Reply

Marsh Posté le 11-06-2004 à 14:30:16    

Taz a écrit :

je parlais pas du fclose(NULL) qui est pas standard : tu vas changer ton programme d'environnement et il marchera pas. franchement je suis sur que tu codes avec les pieds, c'est pas une ligne en plus qui va pourrir ton programme :o


 
non mais on va dire que c'est pour ma culture ... et c'est un soft que je vais être le seul à utiliser donc la portabilité je m'en fous un peu :-)

Reply

Marsh Posté le 11-06-2004 à 14:33:48    

strtok(NULL, "\0" ); ... ça marche pas

Reply

Marsh Posté le 11-06-2004 à 16:47:33    

il faut mettre "\n" alors ? c'est juste pour détecter la fin de la ligne ...
par ailleurs j'ai posté un code incomplet tout à l'heure, le voici now :

Code :
  1. FILE *fichier, *fichier2;
  2. char stringbuf[200];
  3. char *item, *element;
  4. fichier = fopen("./essai.csv","r" );
  5. fichier2 = fopen("./marche.csv","a" );
  6. while(fgets(stringbuf, 200, fichier) != NULL){
  7.     strtok(stringbuf, ";" );
  8.     strtok(NULL, ";" );
  9.     element = strtok(NULL, ";" );
  10.     valuee = strtok(NULL, "\0" );
  11.     if(format_type == 0){
  12.         fprintf(fichier2, "%s%s%s\n", "tata", element, valuee);
  13.         if(strstr(element, item) != NULL){
  14.              fprintf(fichier2, "%s\n", "toto" );   
  15.         }
  16.     }
  17.     fclose(NULL);
  18. }


 
je pense que l'erreur se situe au niveau du :
if(strstr(element, item) != NULL){
mais c'est juste un presentiment  :D  
 
 

Reply

Marsh Posté le 11-06-2004 à 17:30:50    

\n pas \0 ....

Reply

Marsh Posté le 11-06-2004 à 17:46:55    

de toute facon mon problème ne vient pas de là j'en suis sur (je viens de tester  ;) ) ...


Message édité par mirascheat le 11-06-2004 à 17:49:08
Reply

Marsh Posté le 12-06-2004 à 12:52:48    

up! atoi("Taz" ) please  :D

Reply

Marsh Posté le 12-06-2004 à 12:55:18    

atoi("Taz" ) == atoi("0" ) on est bien d'accord

Reply

Marsh Posté le 14-06-2004 à 10:05:44    

j'ai voulu simplement faire :
toto = strstr(element, item);
pour voir la valeur que me renvoyé la comparaison et bein ca plante aussi ...


Message édité par mirascheat le 14-06-2004 à 10:06:05
Reply

Marsh Posté le 15-06-2004 à 11:54:00    

Code :
  1. while(fgets(stringbuf, 200, fichier) != NULL){


 
Je charge une ligne de mon ficher dans stringbuf mais je ne la décharge jamais ... est-ce normal ?
Parce qu'en voyant le résultat j'ai l'impression qu'il y a un buffer qui se charge qui se charge et au bout d'un moment ca fait planter mon programme!!!
 
sinon il est possible de remettre à 0 des char* ?
 
merci pour votre aide

Reply

Marsh Posté le 15-06-2004 à 12:25:34    

déjà c'est pas un char*
après fgets stocke dans ton buffer à partir du premier char, donc ça écrase tout contenu précédent et ça rajoute un '\0' final
 
donc c'est toi qui déconne

Reply

Marsh Posté le 15-06-2004 à 12:33:12    

le char* c'était une autre question ... je demandais juste comment vider un char*
 
En ce qui concerne fgets : si la longueur de ma ligne n-1 est plus grande que ma ligne n, le buffer contient-t-il des résidus de la ligne n-1 au nème passage ?

Reply

Marsh Posté le 15-06-2004 à 12:35:01    

peut être que tu as pas compris comment fonctionnait les chaines en C ?
 
si fgets arrive pas à lire une ligne en entier , le reste, tu le récupère au passage suivant

Reply

Marsh Posté le 15-06-2004 à 12:51:53    

mirascheat a écrit :

le char* c'était une autre question ... je demandais juste comment vider un char*
 
En ce qui concerne fgets : si la longueur de ma ligne n-1 est plus grande que ma ligne n, le buffer contient-t-il des résidus de la ligne n-1 au nème passage ?


oui

Reply

Marsh Posté le 16-06-2004 à 10:25:46    

Bon pour le fait que je pensais qu'il y avait un dépassement de mémoire quelque part j'ai mis des malloc et des free pour voir si ca changeait quelque chose (quoique je ne suis pas sur de bien me servir de ces deux instructions), mais ca ne marche toujours pas ...
Je poste mon code complet :

Code :
  1. void __stdcall search_item(char* filename, char* item, int format_type, int file_nb, int msg_acc_id, int RNC_id)
  2. {
  3.     FILE* pm_counters;
  4.     FILE* extracted_data;
  5.     char stringbuf[200];
  6.     char* stringbuf2;
  7.     char* nodeb;
  8.     char* valuee;
  9.     char* RNC_nb2;
  10.     int RNC_nb;
  11.    
  12.     pm_counters = fopen(filename, "r" );
  13.     extracted_data = fopen("./test.csv", "a" );
  14.    
  15.     while(fgets(stringbuf, 200, pm_counters) != NULL){
  16.         if(strstr(stringbuf, item) != NULL){
  17.             stringbuf2 = malloc(200);
  18.             strcpy(stringbuf2, stringbuf);
  19.             if(format_type == 0){
  20.                 nodeb = malloc(10);
  21.                 valuee = malloc(10);
  22.                 valuee = strrchr(stringbuf2, ';') + 1;
  23.                 if(strchr(stringbuf, '-') != NULL){
  24.                     strtok(stringbuf, "-" );
  25.                     nodeb = strtok(NULL, "-" );
  26.                 }
  27.                 else
  28.                     nodeb = 0;
  29.                
  30.                 if(valuee == "N/A" )
  31.                     valuee = 0;
  32.                 fprintf(extracted_data, "%d%c%d%c%d%c%d%c%s%c%s", file_nb, ';', msg_acc_id, ',', file_nb, ';', msg_acc_id, ';', nodeb, ',', valuee);
  33.                 free(nodeb);
  34.                 free(valuee);
  35.                 free(stringbuf2);
  36.             }
  37.         }
  38.     }
  39.    
  40.     fclose(pm_counters);
  41.     fclose(extracted_data);
  42. }


 
si quelqu'un pouvait m'aider merci

Reply

Marsh Posté le 16-06-2004 à 11:11:22    

if(valuee == "N/A" )
 
 
tu m'appelles le jour ou ça marche ça

Reply

Marsh Posté le 16-06-2004 à 11:33:44    

dring !!!
ca ne marche pas !!!
 
d'accord mais ce n'est pas cette faute de débutant de merde qui fait que mon programme ne marche pas ...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed