使用C ++读取和写入二进制信息

时间:2013-03-17 23:43:44

标签: c++ file-io binaryfiles

我在阅读和编写二进制信息时遇到了一些麻烦。我可以成功地将一个简单的字符串写入文本文件,在这种情况下,我的文件'output.dat'包含句子“你好,这是一个句子”。

但是,我无法读回我的信息。我无法确定问题所在。我打算稍后更改从二进制文件读取的信息的每个字节,因此返回值作为字符串帮助。

感谢您提供的任何帮助。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void write(const string &input) {
    fstream output("output.dat", ios::out | ios::binary);
    if (output.is_open()) {
        output.write(input.c_str(), input.size());
        output.close();
    }
}

string read(const string &fname) {
    int size;
    char* buffer;
    fstream input(fname, ios::in | ios::binary);
    if (input.is_open()) {
        input.seekg(0, ios::end);
        size = input.tellg();
        input.seekg(0, ios::beg);
        buffer = new char[size];
        input.read(buffer, size);
        input.close();
    }
    string result(buffer);
    return result;
}

int main () {
    cout << read("output.dat") << endl;

    system("pause");

    return 0;
}

2 个答案:

答案 0 :(得分:3)

错误就在这里。

char* buffer;
input.read(buffer, size);

您正在读取buffer指向的内存。

但它指向哪里?指针buffer从未初始化。

如果你知道你需要多少空间,这样的方法就可以了。

std::vector<char> buffer(size);
input.read(&buffer.front(), size);

答案 1 :(得分:0)

我真的无法理解这段代码出了什么问题,因为它看起来很好,而且对我很好。然而,您分配的缓冲区缺少空终止符以标记char-string end。只需将其更改为:

buffer = new char[size+1];
input.read(buffer, size);
buffer[size] = 0;