使用fread()读入char *缓冲区

时间:2014-10-12 05:09:09

标签: c++ pointers char buffer fread

我一直致力于为每个字符使用trie和自定义位串的文本文件压缩程序。我正在读取的文件是使用fwrite(name, wb)编写的,我查看了文件(在二进制模式下)并且我已经验证了这些位是否正确。我遇到的问题是将这个二进制文件读回一个可以读取的文件。

void read2(string fname, ofstream &outf)
{
    fname += ".mcp";
    outf << endl;
    std::ifstream inf(fname, std::ios::binary);
    std::vector<char> data{
    std::istreambuf_iterator<char>(inf),
    std::istreambuf_iterator<char>() };
    std::cout << "Size: " << data.size() << '\n';
    std::copy(data.begin(), data.end(), std::ostreambuf_iterator<char>(outf));
}

此功能(cout)的输出如下:

Size: 25 

(使用较小的测试文件)

ofstream输出应为:     10001110 00000100 01001001 10110001 10011001 00101011 01101000 10010101 01000101 01010001     01111010 01101001 10100110 01000000 01111010 00010111 00000110 10101000 11100000 01000101     11011100 11110011 10010111 10001011 00000000 这是读取的数字的二进制形式:(抱歉,将其读作十六进制代码,我直接从输出文件中复制)

c5 bd 04 49 c2 b1 e2 84 a2 2b 68 e2 80 a2 45 51 7a 69 c2 a6 40 7a 17 06 c2 a8 c3 a0 45 c3 9c c3
b3 e2 80 94 e2 80 b9 20  

我使用记事本++的十六进制编辑器插件来查看位。

1 个答案:

答案 0 :(得分:0)

问题的答案实际上非常简单,我用于输出数据的ofstream对象未在二进制模式下打开,所以我只是在二进制模式下创建了一个新对象并输出到它并且它工作了

void read2(string fname, ofstream &outf)
{
    string fname1 =fname+ ".mcp", outfile="binarycheck";
    std::ifstream inf(fname1, std::ios::binary);
    std::ofstream ouf("binarycheck.txt", std::ios::binary);
    std::vector<unsigned char> data{
    std::istreambuf_iterator<char>(inf),
    std::istreambuf_iterator<char>() };
    std::cout << "Size: " << data.size() << '\n';
    std::copy(data.begin(), data.end(), std::ostreambuf_iterator<char>(ouf));
}