Unexpected results with std::ofstream binary write

前端 未结 2 1042
隐瞒了意图╮
隐瞒了意图╮ 2020-12-11 14:25

I\'m new to C++ std::stream and I\'m making some tests. I have this simple code:

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

std::ofstream out(\"test.txt\         


        
相关标签:
2条回答
  • 2020-12-11 14:55

    In order to write raw binary data you have to use ostream::write. It does not work with the output operators.

    Also make sure if you want to read from a binary file not to use operator>> but instead istream::read.

    The links also provide examples how you can handle binary data.

    So for your example:

    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();
    }
    
    0 讨论(0)
  • 2020-12-11 15:02

    std::ios::binary promises to not do any line-end conversions on the stream (and some other small behavioral differences with text streams).

    You could look at

    • Boost Serialization http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html
    • Boost Spirit binary generators http://www.boost.org/doc/libs/1_53_0/libs/spirit/doc/html/spirit/karma/reference/binary/
    • Using ofstream::write(...) to manually write the bytes

    Here's an example using Boost Spirit Karma (assuming Big-Endian byte ordering):

    #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";
    }
    

    This prints

    0x0 0x0 0x0 0xa 0x0 0x63 0x41 0xf3 0x33 0x33 
    
    0 讨论(0)
提交回复
热议问题