Member 13089825 Ответов: 2

Как сохранить строку cstring в файле


i want to write the cstring into the file but iam not able to write the all datat into the file 


Что я уже пробовал:

CString data = "[ошибка]: 2018-03-21 06:51:02 GMT"
fwrite(data, sizeof(data), 1, stream);
    
        fprintf(stream, "\n");
        fflush(stream);
        fclose(stream);

я получаю o/p в файле как "[ E R R"
не могли бы вы поправить меня, если я здесь делаю что-то не так

Richard MacCutchan

Простой ответ заключается в том, чтобы не использовать fwrite, так как это базовая среда выполнения C. Используйте правильные классы MFC для всего.

2 Ответов

Рейтинг:
19

Jochen Arndt

Помимо использования правильной длины, то, что записывается в файл, также зависит от того, является ли ваш проект Unicode или нет.

Правильное решение для написания CString содержание "как оно есть" есть:

fwrite(data.GetString(), sizeof(TCHAR), data.GetLength(), stream);

С Unicode строит, CString содержимое хранится внутри системы в виде wchar_t который имеет размер в два байта. При сборках, отличных от Unicode, он хранится как char. Этот TCHAR type - это соответствующий тип символов в соответствии с настройкой Unicode. Потому что CString::GetLength() возвращает количество символов, размер которых должен быть умножен на размер символа.

Если у вас есть сборка Unicode, но вы хотите записать ее в файл ANSI, вы должны сначала преобразовать строку в ANSI или использовать строку ANSI:
// Using ANSI string
CStringA dataA = "[ERROR]: 2018-03-21 06:51:02 GMT";
fwrite(dataA.GetString(), 1, dataA.GetLength(), stream);

// Writing ANSI with any build option
CString dataAny = _T("[ERROR]: 2018-03-21 06:51:02 GMT");
// This converts to ANSI with Unicode builds and copies otherwise
CStringA dataA(dataAny);
fwrite(dataA.GetString(), 1, dataA.GetLength(), stream);
Обратите внимание на использование CStringA что же это такое char версия.


Рейтинг:
1

OriginalGriff

sizeof возвращает размер объекта, а не его содержимое!
То, что вам нужно, это CString::GetLength[^]


Member 13089825

я использовал как показано ниже но все еще не могу записать всю строку в файл
fwrite(сведения, данные.GetLength(), 1, stream);
не могли бы вы меня поправить

OriginalGriff

Смотрите полное решение Йохена 2!