Lecture d’entiers 16 bits à partir du fichier binary c ++

Je ne suis pas sûr de bien faire les choses, alors je veux vérifier mon code. cela fonctionne mais je ne suis pas sûr que cela fonctionne correctement. J’en ai besoin pour lire le fichier binary et stocker les entiers 16 bits dans un tableau d’ints de taille exacte. J’ai essayé de faire sizeof(storage[i]) afin de voir si je stockais 16 bits, mais le message 32 (je devine, car int alloue automatiquement 4 octets?).

  void q1run(question q){ int end; std::ssortingng input = q.programInput; std::ifstream inputFile (input.c_str(), ios::in | ios::binary); //Open File if(inputFile.good()){ //Make sure file is open before trying to work with it //Begin Working with information cout << "In File: \t" << input << endl; inputFile.seekg(0,ios::end); end=inputFile.tellg(); int numberOfInts=end/2; int storage[numberOfInts]; inputFile.clear(); inputFile.seekg(0); int test = 0; while(inputFile.tellg()!=end){ inputFile.read((char*)&storage[test], sizeof(2)); cout << "Currently at position" << inputFile.tellg() << endl; test++; } for(int i=0;i<numberOfInts;i++){ cout << storage[i] << endl; } }else{ cout << "Could not open file!!!" << endl; } } 

MODIFIER:::::::::::::::::::::::::::::::::::::::::::::;

J’ai changé la déclaration lue en:

  inputFile.read((char*)&storage[test], sizeof(2)); 

et le tableau pour taper short . maintenant cela fonctionne plutôt bien, sauf que la sortie est un peu étrange:

  In File: data02b.bin 8 Currently at position4 Currently at position8 10000 10002 10003 0 

Je ne suis pas sûr de ce qu’il y a dans le fichier .bin, mais je suppose que le 0 ne devrait pas être là. lol

Oui, int correspond à 4 octets (sur une plate-forme 32 bits x86).

Vous avez deux problèmes:

  1. Comme Alec Teal a correctement mentionné dans le commentaire, votre mémoire est déclarée int, ce qui signifie 4 octets. Pas de problème, vraiment – vos données vont s’intégrer.
  2. Problème actuel: votre ligne qui lit le fichier: inputFile.read((char*)&storage[test], sizeof(2)); est en train de lire 4 octets, parce que 2 est un entier, donc sizeof(2) est 4. Vous n’avez pas besoin de sizeof ici.

Utilisez: int16_t dans . (16bits garantis)

Short s et int s peuvent être de tailles différentes selon l’architecture.

Le stockage est déclaré comme un ‘tableau’ de “int” s, sizeof (int) = 4

Cela ne devrait pas être un problème cependant, vous pouvez ajuster les valeurs 16 bits dans des espaces 32 bits, vous vouliez probablement dire short storage[...

De plus, dans un souci de divulgation complète, les tailles sont définies en termes de sizeof (char) comme une séquence augmentant de façon monotone.

4 est de loin le plus commun cependant, d’où l’hypothèse. (Limits.h clarifiera)

Une façon de stocker des entiers 16 bits consiste à utiliser le type short ou unsigned short .

Vous avez utilisé sizeof(2) qui est égal à 4, car 2 étant de type int , la façon de lire 16 consiste à effectuer un storage de type short et à lire:

 short storage[numberOfInts]; .... inputFile.read((char*)&storage[test], sizeof(short)); 

Vous pouvez trouver ici un tableau contenant les tailles de tous les types.