2011-08-07 25 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的第二个参数在这个特定的例子,为什么它与例如。 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); 
} 
+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没有任何工作 - 代码是不可撤销的。 –