2009-11-23 5 views
4

J'ai une image bitmap que je suis en train d'analyser et j'ai besoin de pouvoir ouvrir le fichier et stocker le premier short non signé.Comment lire non signé à court de fichier?

J'ai essayé d'accomplir cela en utilisant FICHIER et fscanf() mais fscanf() échoue toujours et renvoie 0 (nombre d'éléments lus avec succès).

FILE *pFile = fopen (fileName->c_str() , "r"); 

if (pFile == NULL) 
{ 
    cerr << "couldn't open file ; exiting..." << endl; 
    exit(0); 
} 

unsigned short seed; 
fscanf (pFile, "%hu", &seed); 

Est-ce que quelqu'un sait d'une autre approche que je pourrais prendre (peut-être ifstream?) Ou peut-être pourrait me donner quelques pointeurs? Toute aide serait grandement appréciée.

Merci.

Répondre

12

N'utilisez pas les fonctions formatées comme * scanf; ils attendent des représentations de caractères des données, le complément des fonctions * printf qui traduisent les valeurs en représentations de caractères.

unsigned val; 
f = fopen (filename, "rb"); 
if (fread (&val, 1, sizeof (val), f) != sizeof (val)) 
    // error 

La plus grande mise en garde de ceci est comment le fichier a été écrit. Si le boutisme de l'écrivain est différent de l'ordinateur fonctionne sur ce, le code explicite endian doit être utilisé à la place:

unsigned val; 
unsigned char buf[2]; 
f = fopen (filename, "rb"); 
if (fread (buf, 1, sizeof (buf), f) != sizeof (buf)) 
    // error 
else { 
// val = (buf [0] << 8) | buf [1]; // for big endian written file 
    val = (buf [1] << 8) | buf [0]; // for little endian written file 
} 
+2

Cela devrait être 'unsigned char buf [2];', et 'sizeof buf' au lieu de' sizeof (val) '. – caf

+0

S'il vous plaît, Dieu, sortez le # ifdef afin que je puisse upvote votre solution. L'ordre des octets du fichier doit être connu, non déterminé par un paramètre de préprocesseur à la compilation ... –

+0

Merci pour les commentaires - je suis d'accord. – wallyk

1
std::ifstream input("inputfile.txt"); 
unsigned short value; 
input >> value; 
+0

Est-ce pas lire un numéro au format ASCII comme si elle était un peu? OP demande de lire deux octets d'un fichier binaire comme un court. –

3

Ahh! Non! fscanf est pour le texte! %hu cherchera des chaînes comme "1234" dans un fichier, pas les octets réels!

Utiliser fread.

E.g.

FILE *fp = fopen("foo", "rb"); 
unsigned short x; 
fread(&x, sizeof x, 1, fp); 

En effet, attention à l'endianness, et ouvrez le fichier en binaire. "rb" pour être sûr sur Windows. Vérifiez les codes retour, etc.

Questions connexes