如何直接将数字写入ofstream对象?

时间:2017-10-06 13:03:41

标签: c++ file ofstream

当我打开文件的ofstream对象时,我会这样做:

std::ofstream outFile("myfile");

然后我想要一些数字,但它唯一的方法是::write()方法,它采用const char*和一个大小。所以我能做到:

int temp = 5;
outFile.write((const char*)&temp, sizeof(int));

还有输入operator <<,但我不想要格式化输入,我希望它写成纯二进制数据。我想知道我是否可以直接写作:

outFile.write(12, sizeof(int));
outFile.write(10, sizeof(int));

而不是创建临时或先前分配数组。我认为限制是我可以在论证中加入的唯一价值是RValue,并且似乎没有一种方法可以从左值进行左值。我从技术上讲,rvalue一直持续到行尾,所以如果有std::move的反面,它可以工作。是否有可能直接写这些数字?

3 个答案:

答案 0 :(得分:2)

  

所以我能做到:

你可以做得更好:

void writeInt( std::ostream &os, int i )
{
    os.write( reinterpret_cast<const char*>(&i), sizeof( i ) );
}

然后将它与rvalue或左值一起使用:

int i = 0;
writeInt( f, i );
writeInt( f, 5 );
writeInt( f, funtionReturnsInt() );

你应该这样做,因为你以后可能想要更改存储/加载数据的格式,这样你只需要改变一次。

答案 1 :(得分:2)

我喜欢使用可以编写任何基本类型的模板:

template<typename T>
void write_item(std::ostream& os, const T& item) {
    os.write(reinterpret_cast<const char *>(&item), sizeof T);
}

当然,您可能希望在那里设置一些约束,以避免尝试使用更复杂的类型。

答案 2 :(得分:0)

使用“&lt;&lt;”运营商。例如 os&lt;&lt; “123”;  任何字符串或对象都可以写入ostream而无需进行类型转换。