有人可以解释一下将 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 的第二个参数应该是什么,为什么它使用例如 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);
}