34

我是 C++ std::stream 的新手,我正在做一些测试。我有这个简单的代码:

int i = 10;
char c = 'c';
float f = 30.40f;

std::ofstream out("test.txt", std::ios::binary | std::ios::out);
if(out.is_open())
{
    out<<i<<c<<f;
    out.close();
}

正如std::ios::binary我所期望的那样,在文件中打开流时将具有,和test.txt的二进制表示,但我有.icf10c30.4

你能告诉我我做错了什么吗?

4

2 回答 2

18

std::ios::binary承诺不对流进行任何行尾转换(以及与文本流的一些其他小的行为差异)。

你可以看看

这是一个使用 Boost Spirit Karma 的示例(假设 Big-Endian 字节排序):

#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;

int main()
{
    int i = 10;
    char c = 'c';
    float f = 30.40f;

    std::ostringstream oss(std::ios::binary);
    oss << karma::format(
            karma::big_dword << karma::big_word << karma::big_bin_float, 
            i, c, f);

    for (auto ch : oss.str())
        std::cout << std::hex << "0x" << (int) (unsigned char) ch << " ";
    std::cout << "\n";
}

这打印

0x0 0x0 0x0 0xa 0x0 0x63 0x41 0xf3 0x33 0x33 
于 2013-02-08T07:44:42.707 回答
16

为了写入原始二进制数据,您必须使用ostream::write。它不适用于输出运算符。

还要确保如果要从二进制文件中读取,不要使用 operator>> 而是使用istream::read

这些链接还提供了如何处理二进制数据的示例。

所以对于你的例子:

int i = 10;
char c = 'c';
float f = 30.40f;

std::ofstream out("test.txt", std::ios::binary | std::ios::out);
if(out.is_open())
{
    out.write(reinterpret_cast<const char*>(&i), sizeof(i));
    out.write(&c, sizeof(c));
    out.write(reinterpret_cast<const char*>(&f), sizeof(f));
    out.close();
}
于 2013-02-08T07:55:35.557 回答