3

誰かがwchar_t *文字列をバイナリファイルに書き込んでから(fread / fwriteを使用して)読み返す適切な方法を説明できますか?

これが私が持っているものです(その作業)

struct someStruct{
    int someint;
    wchar_t* data;
    int someint2;
}
someStruct s;
s.someint = 111;
s.data = L"blah blah .... lets say 1-1000 characters long";
s.someint2 = 222;

//writing
FILE * f = _wfopen(L"myfile",L"wb");
fwrite(&(s.someint), sizeof(int), 1, f);
fwrite(&(s.data), sizeof(wchar*), 1, f);
fwrite(&(s.someint2), sizeof(int), 1, f);
fclose(f);

//reading
FILE * f2 = _wfopen(L"myfile",L"rb");
fread(&(s2.someint), sizeof(int), 1, f2);
fread(&(s2.data), sizeof(wchar*), 1, f2);
fread(&(s2.someint2), sizeof(int), 1, f2);
fclose(f2);

すべてが機能しており、値が適切にロードされています。問題は、この特定の例で fread と fwrite の 2 番目のパラメーターを何にするかです。たとえば、4 (これは sizeof(wchar_t*)) または 20 で動作し、150 でバッファー オーバーランを引き起こすのはなぜですか。これらの値はデータ長によって異なります。 、

編集:これらは私が使用しているものです(最後にチェックしたときに機能していました:P 1年前):

wchar_t* loadStrFromFile(FILE* file) {
    int strLen;
    fread(&(strLen), sizeof(int), 1, file);
    wchar_t* result = new wchar_t[strLen];
    fread(result, strLen, sizeof(wchar_t), file);
    return result;
}

void saveStrToFile(const wchar_t*& data, FILE* file) {
    int strLen = wcslen(data)+1;
    fwrite(&strLen, sizeof(int), 1, file);
    fwrite(data, strLen, sizeof(wchar_t), file);
}
4

1 に答える 1

3

これは特に間違っています:

fwrite(&(s.data), sizeof(wchar*), 1, f);

これは sizeof(wchar*) = 4 または 8 バイトのみを書き込みます。

ああ、おそらくポインターを書きたくないでしょう。それを逃した。

実際の文字列データを書きたい場合 (Windows を使用していると仮定):

size_t len = wcslen(s.data); //get the number of characters
fwrite(s.data, sizeof(wchar_t), len, f);
于 2011-08-07T19:17:23.677 に答える