我正在尝试将各种值(例如整数和简单结构)导出到二进制文件中。这是一些代码:
#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.a
和myFoo.b
更改为包含256或更多的值(需要存储多于1个字节),则该文件将变为4个字节长。我在Win7上使用Visual Studio 11开发人员预览版;我没有检查是否在其他系统或编译器上发生了相同的情况。如何在256?
答案 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;
。