0

バイナリ情報の読み書きに問題があります。単純な文字列をテキスト ファイルに正常に書き込むことができます。この場合、私のファイル '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;
}
4

2 に答える 2

3

バグはここにあります。

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

buffer指しているメモリを読んでいます。

しかし、それはどこを指しているのですか?ポインタbufferは初期化されていません。

必要なスペースがわかっている場合は、このようなアプローチが有効です。

std::vector<char> buffer(size);
input.read(&buffer.front(), size);
于 2013-03-17T23:50:27.810 に答える
0

このコードは問題がないように見え、問題なく動作するため、このコードで何が問題になっているのか本当に理解できません。それにもかかわらず、割り当てているバッファーには、文字列の末尾をマークするための null ターミネーターがありません。これを次のように変更するだけです:

buffer = new char[size+1];
input.read(buffer, size);
buffer[size] = 0;
于 2013-03-18T00:40:05.807 に答える