从c ++中的二进制文件获取整数值时的垃圾值

时间:2017-03-01 18:49:15

标签: c++ binaryfiles binary-data

我现在正在研究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是个问题。你能告诉我为什么吗?

2 个答案:

答案 0 :(得分:4)

readFile >> ws;会丢弃空格,这对二进制流来说是无意义的。在这种情况下,将跳过字符值9('\t'),从而破坏您的信息流。只需删除该行。

第二个问题是您没有在读取和显示值之间检查流的状态。只有在读取超过文件末尾后才会检测到EOF。这就是为什么你得到两次无效值,第二次读取失败,只留下temp之前的值。 See this question了解更多详情。

答案 1 :(得分:1)

The answer by François Andrieux已经解决了为什么你的代码行为方式的问题。

以下是解决此问题的几种方法。

  1. 使用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();
    
  2. 正确使用while循环。

    readFile.open("file.dat", ios::binary);
    while (readFile.read((char*)(&temp), sizeof(temp)))
    {
       cout << "temp: " << temp << endl;
    }
    readFile.close();