需要解释wchar_t *到二进制文件的读写

问题描述 投票:3回答:1

有人可以解释一下将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的第二个参数应该是什么,为什么它与例如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);
}
c binary fwrite fread
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);
© www.soinside.com 2019 - 2024. All rights reserved.