|
Dernière réponse | |
---|---|
Sujet : C : lire dans un fichier (!) | |
TotOOntHeMooN | Le sprintf de micro$oft est donc mal codé, car il ne devrait logiquement pas fonctionner avec un fichier binaire !
Bonne chance pour la suite de ton programme. Si tu utilises que des fread, fwrite, feof, fopen en précisant le "b", pour binaire, etc... alors tu ne rencontrera pas de problèmes. :) |
Aperçu |
---|
Vue Rapide de la discussion |
---|
TotOOntHeMooN | Le sprintf de micro$oft est donc mal codé, car il ne devrait logiquement pas fonctionner avec un fichier binaire !
Bonne chance pour la suite de ton programme. Si tu utilises que des fread, fwrite, feof, fopen en précisant le "b", pour binaire, etc... alors tu ne rencontrera pas de problèmes. :) |
Carbon_14 | Essai getc(255)... Bof, le caractère est avalé, envoyé aux oubliettes, on continue normalement jusqu'à la fin de fichier, et tous les FFH que j'avais mis sont oubliés, perdus, jetés.
Donc, c'est pas bon cette fonction.. Désolé. :( |
HelloWorld | j'ai refait mes tests et me suis appercu que je me suis gouré dans mon "compte rendu" :O
alors voila, tant qu'a faire, j'ai teste mes source qouq BC++ et sous MS VC++ en fait c'est pas fread qui pose probleme mais fscanf ... j'ai en gros fait ca : ton code :
|
Carbon_14 | Désolé si les arguments des fonctions ne veulent qu'un char. Ca résoudrait rien :( .
Pour getc(), on reçoit un INT d'office :) . Je fabrique un fichier avec des char 255 de suite pour tester (pause boulot) si getc() retourne bien int 255 pour 255, et int -1 pour eof(fichier) sous DOS, bien sûr. |
TotOOntHeMooN | Dans mon example, count me retourne 1 à chaque octet lu, même pour 255. (ce qui est logique)
Je pense que tu as un faut problème... En tout cas, il ne se trouve pas la... Part de mon example, pour faire tes tests |
HelloWorld | bon d'accord, count ne vaut pas EOF, mais en tous cas, apres mes tests, si fread rencontre l'octet 255, il renvoit -1
j'ai fait ca comme test :
|
TotOOntHeMooN | Au fait, fscanf n'est à utilisé qu'en cas de lecture d'un fichier texte. (0x20 à 0x7F)
Si tu veux lire en binaire et surtout dans un fichier binaire, qui est donc suceptible de retourner les valeurs entre 0x00 et 0xFF, il faut utiliser fread. EOF est une macro à utiliser avec des fichiers ASCII. Dans ton cas, il faut bien utiliser fonction feof(). Essai mon example ;) Je ne dis pas qu'il est sans erreur, mais il ne m'en a pas donné l'impression. |
Carbon_14 | En remplaçant unsigned char octet; par int octet; y a pas des fonctions qui "marcheraient" ? :) J'ai pas le temps de regarder les arguments réclamés :( Vu que l'int "monte plus haut" que le char, et que ce qu'on lit ce sont des chars (correspondance directe) le EOF est -1 de toute façon, mais on l'intercepte en int avant de faire char = int; donc espoir peut-être. :D A me relire, c'est abscons ce que je dis. |
TotOOntHeMooN | J'ai fait mon essai sous Visual C++ 6.0 (au travail), et comme tu peux le voir en haut du programme, j'ai utilisé <stdlib.h> et <stdio.h>. Ce programme devrait compiller sans problème sous tous les OS et avec n'iporte quel autre compilo. (gcc entre autre)
Count ne peut pas valoir EOF, puisque si la fin de fichier est rencontrée (feof), la lecture s'arette. En cas d'erreur de lecture, tu devrais avoir le message associé qui s'affiche, et la effectivement, la valeur "total" sera erronée, autrement, elle vaudra bien la taille du fichier lu. Je n'ai pas vérifié avec un éditeur Hexadécial, car le résultat s'avère correct (affichage) par rapport à mon fichier d'essai, qui comportait des 255 entre autre. |
HelloWorld | moi aussi j'ai fais des essais
voici mon compte rendu
|
Carbon_14 | Sauf en septembre ! :sol: :sol:
Il a une fonction eof() qui devrait remplacer if ( == EOF) (vu dans la doc tt à l'heure, jamais utilisée). Syntax #include <io.h> int eof(int handle); Description Checks for end-of-file. eof determines whether the file associated with handle has reached end-of-file. Return Value If the current position is end-of-file, eof returns the value 1; otherwise, it returns 0. A return value of -1 indicates an error; the global variable errno is set to EBADF Bad file number |
TotOOntHeMooN | On retrouve toujours les mêmes... :)
J'ai fait un essai de voici : #include <stdio.h> #include <stdlib.h> int main() { int ret, count, total; unsigned char buffer; FILE *stream; if(!(stream = fopen( "file.bin", "rb" ))) { perror("Erreur de flux" ); ret = 1; } else { total = 0; while(!feof(stream)) { count = fread( &buffer, 1, 1, stream); if( ferror(stream)) { perror("Erreur de lecture" ); break; } else { printf ("%02X ", buffer); total += count; } } printf( "Le fichier fait %d octet(s)\n", total ); fclose( stream ); ret = 0; } // valeur de retour de l'application return (ret); } --- J'utilise un fread, et feof, et ça marche très bien... Ce programme lit (et affiche) octet par octet. A la fin, il indique la taille lu qui doit etre celle du fichier. Pas de problèmes avec 255. |
Carbon_14 | Avec getc(), ca irait peut-être. :) C'est ce que j'utilisais dans mes débuts du C sous DOS (1995). La fonction retourne le caractère lu sous forme d'entier (donc de 0 à 255), ou EOF (-1) si fin de fichier. Il n'y a pas de risque de "confusion" caractériel. :D Syntax #include <stdio.h> int getc(FILE *stream); wint_t getwc(FILE *stream); Description Gets character from stream. getc returns the next character on the given input stream and increments the stream's file pointer to point to the next character. Note: For Win32s or Win32 GUI applications, stdin must be redirected. Return Value On success, getc returns the character read, after converting it to an int without sign extension. On end-of-file or error, it returns EOF. |
HelloWorld | ben voila, j'ai fait un petit programme juste comme ca, un editeur hexa en gros
il ouvre un fichier en mode binaire, il lit un caractere, l'affiche, lit un caractere l'affiche etc ... jusqu'a la fin je test ... ca a l'air de marcher je sors un editeur hexa ... ben non ca marche pas s'il rencontre (fscanf()) un caractere qui vaut 255, pouf ca s'arrete alors tiens, qu'est-ce donc que cela ? je fouine un peu, et je comprend mieux : EOF vaut -1, soit 255 pour un unsigned char donc ma boucle while((car=fscanf(...))!=EOF) elle fouare genant je change pour fread, ben c'est pareil, malgre un while(!feof()) idem while(!feof()) et fscanf j'ai enfin trouve une solution : _getw() ou getw() selon et avec feof ca marche d'ailleurs dans l'aide il le disent de faire gaffe car EOF peut etre une valeur du fichier, et non sa fin mais c'est pour des entiers j'ai rien trouve qui marche pour des caracteres alors quoi ? on peut pas lire un fichier qui contient 0xFF ? comment fscanf et fread peuvent elles influencer sur la fin du fichier (feof renvoit true) |