pb d'EOF

pb d'EOF - C - Programmation

Marsh Posté le 31-07-2007 à 20:01:49    

Bonjour
Dans un programme que je voudrais faire j'aurais besoin de parcourir tout un fichier (quelconque). Je voulais donc faire comme ça :
 

Code :
  1. int fonction(char *fichier)
  2. {
  3.     char c;
  4.     FILE *fpR, *fpW;
  5.     ...
  6.     fpR = fopen(fichier, "r" );
  7.     while((c = fgetc(fpR)) != EOF)
  8.         printf("%c", c);
  9.     fclose(fpR);
  10.     ...
  11. }


 
Ça marche très bien quand le fichier est un fichier txt, mais dès que je lui donne un rar, zip, jpg, ou autre.. à "manger" il trouve des EOF en milieu de fichier et ne parcourt donc pas tout le fichier... Je ne sais pas comment faire autrement car je ne comprends pas le problème ... alors je poste sur ce forum en espérant que quelqu'un ait une idée.
 
Merci d'avance

Reply

Marsh Posté le 31-07-2007 à 20:01:49   

Reply

Marsh Posté le 31-07-2007 à 20:49:04    

Ha, ha, erreur de débutant. fgetc retourne un int pas un char.

Reply

Marsh Posté le 31-07-2007 à 20:56:07    

tpierron a écrit :

Ha, ha, erreur de débutant. fgetc retourne un int pas un char.


 
Non ça ne change rien au problème...
Il y a exactement le même problème avec ça :
 
    int longueur = 0;
 
    fpR = fopen(fichier, "r" );
    while(fgetc(fpR) != EOF)
        longueur++;
    fclose(fpR);

Reply

Marsh Posté le 31-07-2007 à 21:03:06    

tu avais bien le bug du char/int.
 
maintenant ptet qu'avec un "rb" ça marchera mieux :)
 
et un test de fpR est le bienvenu pour se débarasser du crash quand le 'fichier' n'existe pas.

Reply

Marsh Posté le 31-07-2007 à 21:14:59    

bjone a écrit :

tu avais bien le bug du char/int.
 
maintenant ptet qu'avec un "rb" ça marchera mieux :)
 
et un test de fpR est le bienvenu pour se débarasser du crash quand le 'fichier' n'existe pas.


 
Par rapport à ce qu'a dit tpierron : je suis bien loin d'être débutant... J'ai bien sûr essayer plein de choses avant de venir poster, dont le mode "rb" ... le problème est toujours là avec. Avec ce mode il lit le fichier un peu plus loin que précédemment mais pas jusqu'au bout quand même.
 
Et pour le test de fpR je le fais avant l'appel de la fonction dans la main.
 
Je ne comprends absolument pas le problème
(au passage pour le int/char, ça passe très bien si on n'a pas besoin des caractères de code supérieur à 256 :) )

Reply

Marsh Posté le 31-07-2007 à 21:26:07    

fgetc renvoie un int qui contient ou un char convertit en unsigned char (généralement de 0 à 255) ou EOF (qui est négatif, généralement -1).  Si tu convertis le résultat de fgetc en char avant de comparer avec EOF, deux cas sont possibles:
 
char est signé: la lecture d'un caratère de code EOF (généralement ÿ) va être mépris pour EOF.
char est non signé et on boucle indéfiniment.
 
Si on n'ouvre pas un fichier binaire avec rb, alors il y peu y avoir des conversions (par exemple paire CR/LF en \n) et CTRL-Z est parfois détecté comme fin de fichiers.

Reply

Marsh Posté le 31-07-2007 à 21:52:19    

Je pensais que ça ne mènerait à rien mais finalement j'ai fait afficher ce qu'il lit (sans condition de fin de lecture).
Déjà il n'y a qu'en mode "rb" qu'il peut le lire entièrement (en mode "r" il y a rapidement plein de -1).
Donc je me fixe sur le "rb"...
 
Mais le problème maintenant est comment trouver la (vraie) fin du fichier?... parce que des caractères détectés comme fin de fichier sont dans le contenu.
 
Je n'ai pas d'idée... si vous en avez faites-en moi part. (J'ai pensé à arrêter la lecture lors de plusieurs -1 à la suite, mais le pb c'est qu'il se peut qu'il y ait des plages de -1 dans mes fichiers)

Reply

Marsh Posté le 31-07-2007 à 21:59:52    

Code :
  1. int fonction(char *fichier)
  2. {
  3.    int c;
  4.    FILE *fpR;
  5.     fpR = fopen(fichier, "rb" );
  6.     while((c = fgetc(fpR)) != EOF)
  7.        printf("%c", c);
  8.     fclose(fpR);
  9. }

Reply

Marsh Posté le 31-07-2007 à 22:04:12    

Un Programmeur a écrit :

Code :
  1. int fonction(char *fichier)
  2. {
  3.    int c;
  4.    FILE *fpR;
  5.     fpR = fopen(fichier, "rb" );
  6.     while((c = fgetc(fpR)) != EOF)
  7.        printf("%c", c);
  8.     fclose(fpR);
  9. }



 
Déjà fait depuis longtemps...
Ça ne marche pas chez moi, il trouve une fin de fichier avant la fin du fichier...

Reply

Marsh Posté le 31-07-2007 à 22:14:27    

euh au temps pour moi, ça passe bien :) je ne sais pas ce que j'avais fait mais ça ne passait pas tout à l'heure
 
Merci quand même, je pense que je ne serais pas revenu sur ces 2 lignes si tu ne les avais pas repostées

Reply

Marsh Posté le 31-07-2007 à 22:14:27   

Reply

Marsh Posté le 31-07-2007 à 22:19:01    

En continuant mon programme je viens de voir ce que j'ai fait :p je l'avais fait mais pas au bon endroit (un autre endroit très ressemblant, mais qui se passe après, donc je n'avais pas vu qu'en fait ça fonctionnait bien) lol
 
Merci bien

Reply

Marsh Posté le 31-07-2007 à 23:13:50    

bizu53 a écrit :

Par rapport à ce qu'a dit tpierron : je suis bien loin d'être débutant...
...En continuant mon programme je viens de voir ce que j'ai fait :p je l'avais fait mais pas au bon endroit (un autre endroit très ressemblant, mais qui se passe après, donc je n'avais pas vu qu'en fait ça fonctionnait bien) lol


Bon ben apparemment t'es quand-même un peu débutant... ;)  
 
 
 
 


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

Marsh Posté le 31-07-2007 à 23:17:51    

après tout dépend ce qu'on appelle être débutant alors, c'est juste une connerie j'avais pas bien fait gaffe :p (pour ma part ça fait 7ans que je programme donc 2 en C) ;-)

Reply

Marsh Posté le 31-07-2007 à 23:18:20    

Reply

Marsh Posté le 01-08-2007 à 07:58:14    

Y'en a qui restent débutants longtemps :P

Reply

Marsh Posté le 01-08-2007 à 18:48:19    


T'es aussi un débutant sur ce fofo. Au lieu de créer un nouveau post pour rectifier une erreur sur le post précédent tu peux directement éditer ledit post pour le rectifier...   :p
 

matafan a écrit :

Y'en a qui restent débutants longtemps :P


Et dans beaucoup d'endroits  :p  
 


Message édité par Sve@r le 01-08-2007 à 18:50:00

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

Sujets relatifs:

Leave a Replay

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