C ++ File Write включает в себя адрес памяти строки вместо содержимого

Все,
Я все еще изучаю C ++, но у меня есть проблема в проекте, над которой я возился, мне интересно. Я заметил, что когда я пытаюсь напечатать содержимое строки, которая является членом класса, я получаю адрес памяти вместо содержимого. Я понимаю, что это потому, что элемент является указателем, но меня смущает то, что я использую -> Оператор, чтобы почтить его.

Почему я могу оценить члена класса в операторе if, используя -> оператор, чтобы разыменовать его, но при печати в строку файла таким же образом я получаю вместо этого адрес памяти?

Пример ниже:

Допустим, у меня есть класс с именем pClass с членом под названием m_strEmployeeName, Как примечание (я не знаю, имеет ли это значение), m_strEmployeeName значение CString скорее, чем std::stringтак что может быть какая-то неизвестная проблема конверсии, возможно, также.

Если я использовал следующий простой код, я получаю адрес памяти.

std::ofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();

Я получаю то же поведение со следующим методом разыменования (что я ожидаю, так как -> это то же самое).

std::ofstream file("testfile.text");
file << (*pClass).m_strEmployeeName;
file.close();

Есть идеи, что я делаю не так?

2

Решение

Это потому, что ваш CString класс действительно CStringW класс, который содержит wchar_t струны так std::ofstream не содержат operator >> перегрузить эту поддержку wchar_t* строки. Печатать CStringW объекты класса вы можете использовать этот тип потока std::wofstream это признать wchar_t* строки правильно и вывод будет правильным.

std::wofstream file("testfile.text");
file << pClass->m_strEmployeeName;
file.close();

Вы также можете создать свою программу с поддержкой многобайтовых символов. Это можно указать в настройках вашего проекта. Но я предлагаю вам остаться с UNICODE.

2

Другие решения

Попробуй кастинг CString к char указатель:

file << (LPCTSTR)pClass->m_strEmployeeName;

увидеть: Как преобразовать CString и :: std :: string :: std :: wstring друг в друга?

Примечание: это будет работать только если у вас есть TCHAR, определенный как 8 бит. Если вы используете 16-битный UNICODE TCHAR, у вас будет еще одно преобразование.

Вот один из способов сделать TCHAR преобразование:

char c_str[1000];
size_t ret;
wcstombs_s(
&ret,
c_str,
sizeof(c_str),
(LPCTSTR)pClass->m_strEmployeeName,
pClass->m_strEmployeeName.GetLength()
);

std::ofstream file("testfile.text");
file << c_str;
file.close();

Полезно, если вам нужен 8-битный файл ASCII, но есть UNICODE CString работать с.

1

По вопросам рекламы [email protected]