2010-09-02 16 views
0

J'ai besoin de lire exactement 32 bits d'un fichier. J'utilise ifstream dans le STL. Puis-je dire directement:Ai-je besoin de définir l'opérateur ">>" pour utiliser cin avec Int32?

int32 my_int; 
std::ifstream my_stream; 

my_stream.open("my_file.txt",std::ifstream::in); 
if (my_stream && !my_stream.eof()) 
    my_stream >> my_int; 

... ou dois-je remplacer en quelque sorte le >> opérateur de travailler avec int32? Je ne vois pas le int32 répertorié ici: http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/

Répondre

3

L'opérateur d'extraction de flux (>>) exécute formaté IO, IO non binaire. Vous devrez utiliser std::istream::read à la place. Vous devrez également ouvrir le fichier en tant que binary. Oh, et en vérifiant std::istream::eof est redondant dans votre code.

int32 my_int; 
std::ifstream my_stream; 

my_stream.open("my_file.txt",std::ios::in | std::ios::binary); 
if (my_stream) 
{ 
    my_stream.read(reinterpret_cast<char*>(&my_int), sizeof(my_int)); 
} 
//Be sure to check my_stream to see if the read succeeded. 

Notez que faire cela va introduire la dépendance de la plate-forme de votre code, car l'ordre d'octets dans un entier est différent sur différentes plates-formes.

+0

C'est vrai, mais n'est-ce pas un grand endian qui meurt ou meurt? Je n'ai pas vu un système Solaris depuis des années ... –

+0

@Jason: ARM n'est pas mort ou mort :) Aussi, la plupart des formats de fichiers et des protocoles réseau sont spécifiés comme big endian (pour une raison quelconque). –

+0

oh oui, j'ai oublié que ARM est un gros bout endian. Doh! Heureusement, mon code ne sera pas utilisé sur les téléphones intelligents; o) –

2

int32 sera un typedef pour tout type qui arrive à être un entier signé 32 bits sur votre plate-forme. Ce type sous-jacent aura certainement operator>> surchargé pour cela.

Mise à jour

Comme Billy a souligné ci-dessous, les flux sont conçus pour lire le texte et l'analyser dans le type de données surchargé. Ainsi, dans votre exemple de code, il recherchera une séquence de caractères numériques. Par conséquent, il ne lira pas 32 bits de votre fichier.

+1

Mais cela ne lira pas exactement 32 bits du fichier. –

+0

@Billy: bon point, je vais mettre à jour ma réponse ... –

+0

+1 pour le montage. –