Нужно объяснение чтения и записи wchar_t * в двоичный файл - PullRequest
3 голосов
/ 07 августа 2011

Может кто-нибудь объяснить мне, как правильно записать строку 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);
}

1 Ответ

3 голосов
/ 07 августа 2011

Это особенно неправильно:

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);
...