我现在正在研究C ++的二进制文件。我为它制作了一个示例代码,但它不能很好地工作。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream writeFile;
ifstream readFile;
int temp = 1;
writeFile.open("file.dat", ios::binary);
for (int i = 5; i <= 10 ; i++) // range 5 to 10
writeFile.write((char*)(&i), sizeof(i));
writeFile.close();
readFile.open("file.dat", ios::binary);
readFile.seekg(0);
while (!readFile.eof()) {
readFile.read((char*)(&temp), sizeof(temp));
cout << "temp: " << temp << endl;
readFile >> ws;
}
readFile.close();
system("pause");
return 0;
}
结果如下:
temp: 5
temp: 6
temp: 7
temp: 8
temp: 167772160
temp: 167772160
当我更改范围不包括9(例如,5到8)时,它运行良好。此外,当我使用double类型生成相同的代码时,它运行良好。所以我认为整数9是个问题。你能告诉我为什么吗?
答案 0 :(得分:4)
readFile >> ws;
会丢弃空格,这对二进制流来说是无意义的。在这种情况下,将跳过字符值9('\t'
),从而破坏您的信息流。只需删除该行。
第二个问题是您没有在读取和显示值之间检查流的状态。只有在读取超过文件末尾后才会检测到EOF。这就是为什么你得到两次无效值,第二次读取失败,只留下temp
之前的值。 See this question了解更多详情。
答案 1 :(得分:1)
The answer by François Andrieux已经解决了为什么你的代码行为方式的问题。
以下是解决此问题的几种方法。
使用for
循环读取数字。它反映了用于写入它的循环。
readFile.open("file.dat", ios::binary);
for (int i = 5; i <= 10 ; i++)
{
readFile.read((char*)(&temp), sizeof(temp));
cout << "temp: " << temp << endl;
}
readFile.close();
正确使用while
循环。
readFile.open("file.dat", ios::binary);
while (readFile.read((char*)(&temp), sizeof(temp)))
{
cout << "temp: " << temp << endl;
}
readFile.close();