ostream ::写不写整个结构?

时间:2012-04-01 01:03:04

标签: c++ visual-studio-2012

我正在尝试将各种值(例如整数和简单结构)导出到二进制文件中。这是一些代码:

#include <iostream>
#include <fstream>
#include <cstdint>
using namespace std;

template<class T> void writeToStream(ostream& o, T& val)
{
    o.write((char*)&val, sizeof(T));
    cout << o.tellp() << endl;  //always outputs 4
}

struct foo {
    uint16_t a, b;
};

int main()
{
    foo myFoo = {42, 42};
    ofstream test("test.txt", ios::binary);
    writeToStream(test, myFoo);
    test.close();
}

程序应该生成一个4字节长的输出文件。但是当我打开它时,它只有2个字节长。如果我将myFoo.amyFoo.b更改为包含256或更多的值(需要存储多于1个字节),则该文件将变为4个字节长。我在Win7上使用Visual Studio 11开发人员预览版;我没有检查是否在其他系统或编译器上发生了相同的情况。如何在256?

以下的a或b值正确输出

2 个答案:

答案 0 :(得分:2)

文件只能由了解其存储格式的程序读回。 Notepad ++不了解文件的存储格式,因此它无法读回并合理地呈现它。以Notepad ++理解的格式(例如ASCII文本)编写文件,或者仅使用了解您编写格式的程序读取文件。

答案 1 :(得分:0)

我已按如下方式清理您的代码。虽然我不知道为什么旧代码输出两个字节,但新代码输出四个。

#include <iostream>
#include <fstream>
#include <cstdint>
using std::cout;
using std::endl;
using std::uint16_t;
using std::ostream;
using std::ofstream;
using std::ios;

template <class T> void writeToStream(ostream& o, T& val)
{
    o.write(reinterpret_cast<char *>(&val), sizeof(T));
    cout << o.tellp() << endl;  //always outputs 4
}

struct foo {
    uint16_t a, b;
};

int main()
{
    foo myFoo = {42, 42};
    ofstream test("test.txt", ios::binary);
    writeToStream(test, myFoo);
    // Just let the stream "test" pass out of scope.
    // It closes automatically.
    //test.close();
    return 0;
}

(我的标准库缺少 cstdint,所以我使用了short而不是uint16_t,,但我怀疑这很重要。)

std::ofstream类型派生自std::ostream。如果传递普通writeToStream()std::ostream函数会更快乐,或者至少更常规且更通用。另外,有关信息:在C ++中几乎从不推荐问题using namespace std;

祝你好运。