uzak Posté(e) le 15 avril 2010 Partager Posté(e) le 15 avril 2010 Bonjour, Je sèche sur un petit problème de lecture de fichier : la fonction me sort un EOF alors que le fichier n'est pas terminé (ouvert avec un éditeur hexa) Du coup, je peux pas finir de le lire et le fread fait n'importe quoi. Est-ce que ça vous est déjà arrivé ? Je vous mets le bout de code en question, si vous voyez des erreurs : (c'est un peu bordélique, j'ai fait des tests partout) int DirInfo(long DirOffset, FILE* tiff_file){ char buffer[12]; short * tag; short * type; long * count; long * value; char str_type[6]; short len_type; short read_bytes; fseek(tiff_file, DirOffset, SEEK_SET); errno=0; clearerr(tiff_file); read_bytes=fread(buffer, 1,12,tiff_file); if(read_bytes!=12){ if(ferror(tiff_file)){ perror("error reading file"); exit(2); } if(feof(tiff_file)){ int read_value; fseek(tiff_file, DirOffset, SEEK_SET); do{ printf("pos : %x\t", ftell(tiff_file)); read_value=fgetc(tiff_file); if(read_value!=EOF){ printf("%u\n", read_value); } else { printf("EOF\n"); } }while(read_value != EOF && ftell(tiff_file) <= DirOffset+12); } } et la sortie (j'essaie de lire un tiff) : Pos IDF 1112 IDF n░1 12 Directories Dir 1 @ 45a Tag : 254 Type : LONG-4 Count : 1 Dir 2 @ 466 Tag : 256 Type : SHORT-2 Count : 1 Dir 3 @ 472 Tag : 257 Type : SHORT-2 Count : 1 Dir 4 @ 47e Tag : 258 Type : SHORT-2 Count : 1 Dir 5 @ 48a Tag : 259 Type : SHORT-2 Count : 1 Dir 6 @ 496 Tag : 262 Type : SHORT-2 Count : 1 Dir 7 @ 4a2 Tag : 273 Type : LONG-4 Count : 1 Dir 8 @ 4ae Tag : 277 Type : SHORT-2 Count : 1 Dir 9 @ 4ba Tag : 278 Type : LONG-4 Count : 1 Dir 10 @ 4c6 Tag : 279 Type : LONG-4 Count : 1 Dir 11 @ 4d2 pos : 4d2 EOF error ? 0 eof ? 16 No error Type : 4294954188. Inconnu, Directory passee Dir 12 @ 4de Tag : 283 Type : RATIO-8 Count : 1 Comme vous pouvez voir, ça plante sur le 11° directory, à l'offset 4d2 du fichier, et quand je vais lire le tag suivant (offset 4de), ben ça marche... En 4d2, le fichier contient "1a". Merci de votre aide Lien vers le commentaire Partager sur d’autres sites More sharing options...
uzak Posté(e) le 15 avril 2010 Auteur Partager Posté(e) le 15 avril 2010 Ok, j'ai trouvé. J'ai bien fait d'aller manger. Le caractère 0x1A (Ctrl-Z) est le caractère de fin de fichier texte chez MS. doc de fopen : t Open in text (translated) mode. In this mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing with "a+", fopen checks for a CTRL+Z at the end of the file and removes it, if possible. This is done because using fseek and ftell to move within a file that ends with a CTRL+Z, may cause fseek to behave improperly near the end of the file. b Open in binary (untranslated) mode; translations involving carriage-return and linefeed characters are suppressed. If t or b is not given in mode, the default translation mode is defined by the global variable _fmode. If t or b is prefixed to the argument, the function fails and returns NULL. donc au lieu d'un fopen(blabla, "r"), il me faut un fopen (blabla "rb") Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.