我不确定我是否正确这样做,所以我想查看我的代码。它有效,但我不确定它的工作正常。我需要它来读取二进制文件,并将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不应该存在。洛尔
答案 0 :(得分:7)
在int16_t
中使用<cstdint>
。 (保证16位)
Short
和int
可以有各种不同的尺寸,具体取决于架构。
答案 1 :(得分:4)
是的,int是4个字节(在32位x86平台上)。
你有两个问题:
inputFile.read((char*)&storage[test], sizeof(2));
实际读取4个字节,因为2是整数,因此sizeof(2)
是4.您不需要sizeof
答案 2 :(得分:0)
存储被声明为“int”的'数组',sizeof(int)= 4
这应该不是问题,你可以在32位空间中拟合16位值,你可能意味着short storage[...
答案 3 :(得分:0)
存储16位整数的一种方法是使用类型short
或unsigned short
。
您使用的sizeof(2)
等于4,因为2的类型为int
,因此读取16的方法是使storage
类型为short
并且读取:
short storage[numberOfInts];
....
inputFile.read((char*)&storage[test], sizeof(short));
您可以找到here一个包含所有类型大小的表格。