Comment connaitre le nombre de char dans une fichier texte.txt

Comment connaitre le nombre de char dans une fichier texte.txt - C - Programmation

Marsh Posté le 26-05-2006 à 10:40:29    

voilà tout est dans la question
car si je veux imprimer sur stdin gràce à fgets il me faut une taille

Code :
  1. fgets(b,sizeof b,file


ou sinon quel autre fonction utiliser sans avoir besoin de spécifier la taille ?
 
merci d'avance :pt1cable:  :pt1cable:  :hello:

Reply

Marsh Posté le 26-05-2006 à 10:40:29   

Reply

Marsh Posté le 26-05-2006 à 11:01:37    

while(getchar() != EOF) {
   i++;
}

Reply

Marsh Posté le 26-05-2006 à 11:07:18    

une solution portable, mais uniquement pour des fichiers (pas des fluxs): utiliser fseek et ftell.

Code :
  1. long filesize=-1;
  2. if(fseek(file, 0, SEEK_END)<0)
  3.   perror("Error: file not seekable" );
  4. else
  5. {
  6.   filesize=ftell(file);
  7.   if(filesize<0)
  8.     perror("Error: file not positionnable" );
  9.   if(fseek(file, 0, SEEK_SET)<0)
  10.     perror("Error: can't rewind file" );
  11. }
  12. // à partir d'ici filesize contient la taille du fichier


Reply

Marsh Posté le 26-05-2006 à 11:29:19    

merci à vous je vais prendre la première solution car je n'ai pas besoin de portabilité..
 
merci bcp à vous !

Reply

Marsh Posté le 26-05-2006 à 11:30:39    

magiclazy a écrit :

voilà tout est dans la question
car si je veux imprimer sur stdin gràce à fgets il me faut une taille

Code :
  1. fgets(b,sizeof b,file




Une taille de ligne . Tu donnes une taille raisonnable (128, 256...). Si la ligne n'est pas lue complètement, le \n ne sera pas présent. Mais la lecture suivante lira la suite. 0 priori, pas de perte de données.

Citation :


ou sinon quel autre fonction utiliser sans avoir besoin de spécifier la taille ?


Rien de standard. Avec realloc() et fgetc() tu peux en faire une. C'est fun !


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-05-2006 à 11:31:55    

magiclazy a écrit :

merci à vous je vais prendre la première solution car je n'ai pas besoin de portabilité..

Elle est portable, mais je suis pas sûr qu'elle fasse ce que tu veux...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-05-2006 à 11:36:06    

effectivment j'ai pas bien refléchi ..
sa ne va pas avec getchar  
 
mais en te relisant (emmanuel) effectivement c'est lecture de ligne et ce qu'il me faudrait c'est lecture de tout le fichier ..

Reply

Marsh Posté le 26-05-2006 à 11:46:18    

magiclazy a écrit :

voilà tout est dans la question
car si je veux imprimer sur stdin gràce à fgets il me faut une taille

Code :
  1. fgets(b,sizeof b,file


ou sinon quel autre fonction utiliser sans avoir besoin de spécifier la taille ?


Si tu veux juste connaître la taille d'un fichier, tu peux utiliser "stat()"
Si tu veux le traiter (copier, afficher), tu fais une boucle de lecture+traitement
 

Emmanuel Delahaye a écrit :

Une taille de ligne . Tu donnes une taille raisonnable (128, 256...). Si la ligne n'est pas lue complètement, le \n ne sera pas présent. Mais la lecture suivante lira la suite. 0 priori, pas de perte de données.


Si c'est pour lire bloc par bloc sans avoir besoin de traiter la ligne, je privilégierais "fread()" plutôt que "fgets()"
Au pire, il y aura autant d'itérations avec l'une que l'autre...


Message édité par Sve@r le 26-05-2006 à 11:48:46

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 11:48:38    

je vois sois et je vous dis demain merci  
 
ps:je bloque pour pour sortir le resultat d'un system(); vers un 'file' que j'ai crée plutot avec FILE*file=fopen();
merkiii

Reply

Marsh Posté le 26-05-2006 à 11:52:07    

magiclazy a écrit :

je vois sois et je vous dis demain merci  
 
ps:je bloque pour pour sortir le resultat d'un system(); vers un 'file' que j'ai crée plutot avec FILE*file=fopen();
merkiii


 
system() lance un autre programme sans aucune intéraction possible avec le programme initial.  
 
Solution batarde mais immédiatement disponible :
Tu peux faire

Citation :

system("programme2 >fichier" )


Puis

Citation :

fopen("fichier", "r" (ou "rb", ça dépend))


 
Ou alors utiliser des mécanismes plus fin de communication entre programmes comme pipes, socket, files de messages, etc...


Message édité par Sve@r le 26-05-2006 à 11:52:48

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 11:52:07   

Reply

Marsh Posté le 26-05-2006 à 11:52:17    

hap j'ai rien dis avec ce model sa devrait aller !!

Code :
  1. FILE *fin;
  2. FILE *fout;
  3. int c;
  4. fin=popen("netstats -a", "r" );
  5. fout=fopen("fic.txt", "w" );
  6. while ((c=fgetc(fin)) != EOF)
  7.     fputc(c, fout);
  8. fclose(fout);
  9. pclose(fin);


 
 
[EDIT]grilled !! j'essaye ta méthode !

Message cité 1 fois
Message édité par magiclazy le 26-05-2006 à 11:53:05
Reply

Marsh Posté le 26-05-2006 à 11:54:23    

magiclazy a écrit :

grilled !! j'essaye ta méthode !


Non, le popen est meilleur que le system !!!


Message édité par Sve@r le 26-05-2006 à 11:55:08

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 11:54:30    

je peux pas applique ta méthode car plus au dans le programme je génere le nom du *.txt ...

Reply

Marsh Posté le 26-05-2006 à 11:56:48    

magiclazy a écrit :

je peux pas applique ta méthode car plus au dans le programme je génere le nom du *.txt ...


Mais si tu peux. Puisque le pgm2 génère lui-même le fichier écrit, tu peux faire juste "fopen("fic.txt", "r" )". Mais comme je l'ai dit, le popen est fait pour ça donc c'est préférable au system()


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 11:59:49    

Code :
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <locale.h>
  4. void un_commande()
  5. {
  6. char tch[80+1];
  7. char fmt[80+1];
  8. struct tm *pdh;
  9. int nm;
  10. time_t intps;
  11. intps=time(NULL);
  12. pdh=localtime(&intps);
  13. setlocale( LC_TIME, "fr_FR" );
  14. strftime ( tch, 81,"%A %m %B %Y.txt",pdh);
  15. FILE *file;
  16. printf("\n\n    [ NAME OF FILE ] : %s",tch);
  17. FILE *fin;
  18. FILE *fout;
  19. int c;
  20. fin=popen("Gpresult", "r" );
  21. fout=fopen(tch,"a+" );;
  22. while ((c=fgetc(fin)) != EOF)
  23. fputc(c, fout);
  24. fclose(fout);
  25. pclose(fin);
  26. fclose(file);
  27. getch();
  28. }


 
je l'ai vite fait adapter sa à l'air de marcher

Reply

Marsh Posté le 26-05-2006 à 12:23:54    

magiclazy a écrit :

Code :
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <locale.h>
  4. void un_commande()
  5. {
  6. char tch[80+1];
  7. char fmt[80+1];
  8. struct tm *pdh;
  9. int nm;
  10. time_t intps;
  11. intps=time(NULL);
  12. pdh=localtime(&intps);
  13. setlocale( LC_TIME, "fr_FR" );
  14. strftime ( tch, 81,"%A %m %B %Y.txt",pdh);
  15. FILE *file;
  16. printf("\n\n    [ NAME OF FILE ] : %s",tch);
  17. FILE *fin;
  18. FILE *fout;
  19. int c;
  20. fin=popen("Gpresult", "r" );
  21. fout=fopen(tch,"a+" );;
  22. while ((c=fgetc(fin)) != EOF)
  23. fputc(c, fout);
  24. fclose(fout);
  25. pclose(fin);
  26. fclose(file);
  27. getch();
  28. }


 
je l'ai vite fait adapter sa à l'air de marcher


Ben très vite fait alors.
1) même si le C permet maintenant de faire ce qu'on veut, on déclare quand-même les variables avant les instructions
2) tu fermes "file" sans l'avoir ouvert


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 12:27:58    

Code :
  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <locale.h>
  4. void un_commande()
  5. {
  6. char tch[80+1];
  7. char fmt[80+1];
  8. struct tm *pdh;
  9. time_t intps;
  10. intps=time(NULL);
  11. pdh=localtime(&intps);
  12. setlocale( LC_TIME, "fr_FR" );
  13. strftime ( tch, 81,"%A %m %B %Y.txt",pdh);
  14. printf("\n\n    [ NAME OF FILE ] : %s",tch);
  15. FILE *file;     /* declaration du fichier *.txt de stockage*/
  16. FILE *fin;      /* declaration du fichier pour stocker la commande*/
  17. int c;
  18. fin=popen("Gpresult", "r" );    /*atribution du resultat a fin*/
  19. file=fopen(tch,"a+" );           /*creation ou ouverture du fichier de stockage*/
  20. while ((c=fgetc(fin)) != EOF)   /*si il n'y pas d'erreur et tant qu'on est pas à la fin deGpresult*/
  21. {fputc(c, file);}               /*écrire résultats*/
  22.                                 /*fermeture          */
  23. pclose(fin);                    /*        des        */
  24. fclose(file);                   /*          fichiers */
  25. }


 
voilà, enfin pour les commentaires mais si vous denoté une erreur flagrante de vocabulaire qui montre une imcoprehension de ma part n'hesitez pas !:):)


Message édité par magiclazy le 26-05-2006 à 12:35:40
Reply

Marsh Posté le 26-05-2006 à 12:53:21    

dites, c'est peut-etre une grosse connerie, mais est ce qu'il n'y a pas moyen de diviser la taille du fichier en octect par sizeof(char) ?  
 
Il doit bien y avoir un truc stat qui donne la taille non ?

Reply

Marsh Posté le 26-05-2006 à 13:13:50    

kruso a écrit :

dites, c'est peut-etre une grosse connerie, mais est ce qu'il n'y a pas moyen de diviser la taille du fichier en octect par sizeof(char) ?


Vu que sizeof (char) vaut 1 par définition, ça va pas nous avancer beaucoup...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-05-2006 à 14:15:53    

Emmanuel Delahaye a écrit :

Citation :

dites, c'est peut-etre une grosse connerie, mais est ce qu'il n'y a pas moyen de diviser la taille du fichier en octect par sizeof(char) ?


Vu que sizeof (char) vaut 1 par définition, ça va pas nous avancer beaucoup...

On passe parfois de bon moment sur les forum de dev [:darcktom]

Reply

Marsh Posté le 26-05-2006 à 14:16:16    

Emmanuel Delahaye a écrit :

Vu que sizeof (char) vaut 1 par définition, ça va pas nous avancer beaucoup...


[:ddr555] [:ddr555]
 

kruso a écrit :

dites, c'est peut-etre une grosse connerie, mais est ce qu'il n'y a pas moyen de diviser la taille du fichier en octect par sizeof(char) ?


...and the winner is...


Message édité par Sve@r le 26-05-2006 à 14:17:17

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 15:53:55    

bon tout le monde a beau l'air de se foutre de moi, je ne pige quand même pas pourquoi ça ne marche pas ...
 
la fonction int stat(const char *file_name, struct stat *buf); permet bien d'avoir la taille en octect non ?
 
Pour le sizeof(char) c'était juste par soucis de clarté, c'est vrai que c'est inutile xD
 

Reply

Marsh Posté le 26-05-2006 à 16:36:30    

kruso a écrit :

la fonction int stat(const char *file_name, struct stat *buf); permet bien d'avoir la taille en octect non ?


Oui. Elle te donne les informations sur un fichier (type, propriétaire, droits, etc...) et, entre autres, sa taille. mais faut savoir s'en servir...

Code :
  1. struct stat statFic;
  2. stat("fichier", &statFic);
  3. printf("Taille: %lu\n", statFic.st_size);


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-05-2006 à 17:40:05    

Sve@r a écrit :

Oui. Elle te donne les informations sur un fichier (type, propriétaire, droits, etc...) et, entre autres, sa taille. mais faut savoir s'en servir...

Code :
  1. struct stat statFic;
  2. stat("fichier", &statFic);
  3. printf("Taille: %lu\n", statFic.st_size);



 
Ben comment s'en servir ça se trouve dans n'importe quel man :)
 
Et ça n'a que des avantages : on fait un seul appel systeme, on ne parcours pas tout le fichier ...
 
bref je pige pas pourquoi tout le monde se fout de moi  :D

Reply

Marsh Posté le 26-05-2006 à 18:01:55    

kruso a écrit :

Ben comment s'en servir ça se trouve dans n'importe quel man :)
 
Et ça n'a que des avantages : on fait un seul appel systeme, on ne parcours pas tout le fichier ...
 
bref je pige pas pourquoi tout le monde se fout de moi  :D


Par de problèmes avec stat() (à part que c'est pas standard C, mais POSIX.1, portabilité non garantie...).  
 
C'est ta tirade sur le nombres d'octets qui nous a fait bien rire...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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