Forum Clubic

[c++] lecture fichier en mode binaire

Salut

alors je precise que c’est la premiere fois que je lis des fichiers en mode binaire alors je dois faire des conneries.

Donc ce que j’ai besoin de faire c’est lire un fichier binaire qui contient des entiers.
Chaque entier est stocké sur 2 bits.

Donc je me suis dis je vais creer un int et faire un read de 2 bits et le mettre dans mon int.
Ca donne ca :


	int buffer;
	while(true) {
  file.read((char*)&buffer,2);
  cout<<"c = "<<buffer<<"."<<endl;
  cin.get();
	}

Ca marche: les bonnes valeurs s’affichent.

Par contre si je declare un autre int, par exemple :


	int buffer;
	int test;
	while(true) {
  file.read((char*)&buffer,2);
  cout<<"c = "<<buffer<<"."<<endl;
  cin.get();
	}

Ben ca marche plus, mon buffer contient n’importe quoi.
Donc j’en deduit que meme si ca marche dans mon premier code, je dois pas faire le bon truc, mais je sais pas ou est mon erreur?

merci de m’aider.

Tu es sûr que tes entiers sont stockés sur deux bits? :slight_smile:

Sinon, si tu veux faire de la lecture bit à bit, y a pas :slight_smile: faut plonger la main dans la pate.

oui
D’ailleur dans mon premier code si je le lance ca marche tres bien je lis mes entiers comme il faut.

EDIT : en fait ce sont des short.

C’est a dire?
pour lire un bit il suffit de faire un read( buffer , 1 ) non?

Donc en declarant un short au lieu d’un int ca marche mieux :smiley:
Merci de m’avoir mis sur la voie :slight_smile:

Pour éviter ce genre de prise de tête, toujours utiliser sizeof(type) :wink:

cm2> non pour lire un bit, faut faire de la lecture bit à bit :slight_smile: ce que tu fais c’est de la lecture byte à byte :wink:

Et en l’occurrence tu lis un short int (2 bytes).

Par contre, c’est une très mauvaise idée d’écrire des entiers comme ça dans un flux, sans décider d’un format de lecture (big endian, little endian), puisque ta conversion foirera sur une machine représentant les entiers d’une autre façon que la tienne.

ok c’est ce que je vais faire.

Quand tu dis sans décider d’un format de lecture, je comprends pas bien. Deja mon fichier sera le meme quelque soit la machine non? (ce n’est pas moi qui cree les fichiers). Donc tu veux dire que ce code peut ne pas marcher sur un machine qui represente les entiers d’une autre facon? mais c’est pas le compilateur qui gere ca?

Non.

Un Mac PowerPC (big endian je crois) ne verra pas les choses de la même façon.

Ce que je veux dire, c’est que :

int i = 0xDEADBEEF;
fwrite(f, &i, sizeof(int));

...

fread(f, &i, sizeof(int));
printf("0x%8X", i);

Tu n’auras pas le même résultat selon la façon dont la machine représente les entiers en mémoire.