在C ++中从/向二进制文件读取和写入整数

时间:2017-09-29 19:07:03

标签: c++ file-io binaryfiles ifstream

尝试编写一个将整数值写入文件的简单程序,然后按照编写顺序读取并显示整数。写入文件的整数是{0,2,...... 18}。以下是代码:

// Example program
#include <iostream>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
using namespace std;

int main()
{
    typedef unsigned int uint32_t;
    // Write to file
    std::ofstream osObj;
    string filename = "testFile";
    osObj.open(filename.c_str(), std::ofstream::binary);

    for (uint32_t i=0; i<10; ++i)
    {
        uint32_t a = i*2;
        osObj.write(reinterpret_cast<const char *>(&a), sizeof(a));
        //osObj.write((char *)(&a), sizeof(a));
    }

    //read from file
    std::ifstream isObj;
    isObj.open(filename.c_str(), std::ofstream::binary);
    if (isObj.fail()) { cout<<"Failed to open file"<<endl; }

    for (uint32_t i=0; i<10; ++i)
    {
        char val[sizeof(uint32_t)];
        isObj.read(val, sizeof(val));
        uint32_t* valUint = reinterpret_cast<uint32_t *>(val);
        cout<<*(valUint)<<endl;
    }
    return 0;
}

这不会产生预期的结果。我得到以下输出:

62586880
62586880
62586880
62586880
62586880
62586880
62586880
62586880
62586880
62586880

字节顺序是little-endian。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您不应将i添加到valUint。您只需将一个整数读入val,因此您刚读取的整数位于valUint指向的地址。它不是一个整数数组,所以没有理由索引指针。

    cout<< *valUint << endl;

更简单的写作方式是:

for (unint32_t i = 0; i < 10; ++i) {
    uint32_t val;
    isObj.read(reinterpret_cast<char *>&val, sizeof val);
    cout << val << endl;
}

此外,您应该在写入循环结束时执行osObj.close()。文件被缓冲,缓冲区可能没有被刷新。如果您在阅读时检查了错误,您可能会注意到没有从文件中读取任何内容。