3

単純に見えるかもしれませんが、うまくいかない理由を見つけたいと思っています。私は2つの機能を持っていますread_file_cpp()& write_file_cpp(). read_file_cpp()ファイルを読み取り、unsigned char ポインターに格納し、write_file_cpp()unsigned char ポインターからファイルにデータを書き戻します。

しかし、ストリームを使用basic_ifstream<unsigned char>またはbasic_ofstream<unsigned char>ファイルすると、両方の関数がデータを読み書きできず、unsigned char ポインターの内容は変更されません。以下にコード スニペットを示します。

int read_file_cpp(unsigned char *pInData,
                  int in_len,
                  string file_name) {

    basic_ifstream<unsigned char> file_stream;

    file_stream.open(file_name.c_str(),ios::in | ios::binary);

    if (!file_stream.is_open()) {
        cout << stderr << "Can't open input file !\n";
        exit(1);
    }
    else{
        file_stream.read(pInData,in_len);
    }

    file_stream.close();

    return 0;
}

int write_file_cpp(string file_name,
                   unsigned char *pOutData,
                   int out_len) {

basic_ofstream<unsigned char> file_stream;

file_stream.open(file_name.c_str(),ios::out | ios::binary | ios::trunc);

if (!file_stream.is_open()) {
    cout << stderr << "Can't open output file !\n";
    exit(1);
}
else{
    file_stream.write(pOutData,out_len);
}

file_stream.close();

return 0;
}

しかし、ifstreamorを使用ofstreamして char ポインターに型キャストすると、両方の関数が正しく機能します。つまり、

int read_file_cpp(unsigned char *pInData,
                  int in_len,
                  string file_name) {

    ifstream file_stream;

    file_stream.open(file_name.c_str(),ios::in | ios::binary);

    if (!file_stream.is_open()) {
        cout << stderr << "Can't open input file !\n";
        exit(1);
    }
    else{
        file_stream.read((char *)pInData,in_len);
    }

    file_stream.close();

    return 0;
}

正常に動作しています。basic_ifstream<unsigned char>unsigned char ポインター型を作成または適切に動作させる方法、または またはを使用basic_ofstream<unsigned char>するときに型キャストを回避する方法はありますか?ifstreamofstream

4

1 に答える 1

1

unsigned char には istream または ostream メソッドがないため、型キャストが必要です。

ところで、関数内で実際に読み書きされたバイト数を返したい場合があります (そうしないと、渡されるので冗長になります)。

文字を読み取るには、 std::istream::gcountを使用します。

于 2013-11-11T18:19:20.007 に答える