从二进制文件c ++中读取16位整数

时间:2013-12-11 18:08:12

标签: c++ binary sizeof

我不确定我是否正确这样做,所以我想查看我的代码。它有效,但我不确定它的工作正常。我需要它来读取二进制文件,并将16位整数存储在所需的确切大小的整数数组中。我试着做sizeof(storage[i])所以我可以看看我是否存储了16位但它说32(我猜是因为int会自动分配4个字节?

        void q1run(question q){
        int end;
        std::string 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;
      }
 }

EDIT :::::::::::::::::::::::::::::::::::::::::::::;

我将read语句更改为:

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

和要键入short的数组。现在它很好用,除了输出有点奇怪:

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

我不确定.bin文件中有什么,但我猜测0不应该存在。洛尔

4 个答案:

答案 0 :(得分:7)

int16_t中使用<cstdint>。 (保证16位)

Shortint可以有各种不同的尺寸,具体取决于架构。

答案 1 :(得分:4)

是的,int是4个字节(在32位x86平台上)。

你有两个问题:

  1. 正如Alec Teal在评论中正确提到的那样,你的存储空间被声明为int,这意味着4个字节。没问题,真的 - 你的数据会适合。
  2. 实际问题:您正在读取文件的行:inputFile.read((char*)&storage[test], sizeof(2));实际读取4个字节,因为2是整数,因此sizeof(2)是4.您不需要sizeof

答案 2 :(得分:0)

存储被声明为“int”的'数组',sizeof(int)= 4

这应该不是问题,你可以在32位空间中拟合16位值,你可能意味着short storage[...

另外,为了完全公开,尺寸以sizeof(char)的形式定义为单调递增的序列。

到目前为止,4是最常见的,因此是假设。 (Limits.h将澄清)

答案 3 :(得分:0)

存储16位整数的一种方法是使用类型shortunsigned short

您使用的sizeof(2)等于4,因为2的类型为int,因此读取16的方法是使storage类型为short并且读取:

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

您可以找到here一个包含所有类型大小的表格。