2011-08-07 39 views
3

wchar_t *文字列をバイナリファイルに書き込んでからfread/fwriteを使ってそれを読み取る正しい方法は何ですか?ここ wchar_t *のバイナリファイルへの読み書きの説明

は、私は値が正しくロードされ、

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の場合、これらの値はデータ長によって異なります。

EDIT:これらは私が使っているものです。 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); 
} 
+2

は、まあ、それは私と一緒に間違っているすべてのものを列挙するのに長い時間がかかるだろうさそれ。 – Puppy

+0

もしこれがC++なら、あなたが言うように、 'std :: wstring'を使ってストリームを使って永続させるのはなぜですか?そしてCの答えが必要な場合は、再度タグを付けてください。 –

+3

ファイルにポインタ値を書き込むことは*決して*正確ではありません。あなた自身でこれを見るためにファイルを読む別のプログラムを書いてください。 –

答えて

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, len, sizeof(wchar_t), f); 
+2

これはポインタを書き込むので、ポインタのどれくらいが書き込まれているかは実際問題ではありませんか? –

+0

うん、私の悪い、慎重でない。 –

+0

@ sv13何も何も進んでいませんでした。コードは取り返しがつきません。 –

関連する問題