Aller au contenu

[Résolu]Lecture de fichier en C


uzak

Messages recommandés

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... :D

En 4d2, le fichier contient "1a".

Merci de votre aide

:transpi:

Lien vers le commentaire
Partager sur d’autres sites

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...