#c #winapi
Вопрос:
Хорошо, у меня есть file.txt который содержит это содержимое:
xzline1n
xzline2n
Когда я запускаю его, окно содержит следующее:
xzline1nxzline2n
и не
xzline1
xzline2
Не распознаю символы новой строки n, не знаю почему.
Мое окно определено следующим образом
LPCWSTR recordin;
HWND hEdit;
hEdit = CreateWindow(TEXT("EDIT"), NULL,
WS_VISIBLE | WS_CHILD | WS_BORDER | WS_HSCROLL | WS_MAXIMIZE | ES_MULTILINE,
10, 10, 200, 25,
hWnd, (HMENU)NULL, NULL, NULL);
std::ifstream t("c://file.txt");
std::stringstream buffer;
buffer << t.rdbuf();
std::wstring stemp = s2ws(buffer.str());
recordin = stemp.c_str();
SetWindowText(hEdit, recordin);
std::wstring s2ws(const std::stringamp; s)
{
int len;
int slength = (int)s.length() 1;
len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
wchar_t* buf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
std::wstring r(buf);
delete[] buf;
return r;
}
Комментарии:
1. Содержит ли ваш файл буквально обратную косую черту ( » «), за которой следует » n » в конце каждой строки, или вместо этого моя попытка форматирования закрыла проблему?
2. Да, каждая строка содержит n в конце. Я на самом деле попробовал это без n, и он просто отобразил все в одной строке, как это xzline1xzline2
3. Я написал ответ ниже. Но если в вашем текстовом файле буквально есть «косая черта» и «n», ответ все равно в основном применим. Вам нужно преобразовать индикаторы конца строки в
"rn"
для Windows, чтобы интерпретировать их как маркер конца строки для элемента управления редактированием.4. Это
n
один символ с кодом 10 (0x0A) или это «обратная косая черта-нижний регистр-N»? Вероятно, второе (неверно), потому что у вас есть «n» в «xzline1nxzline2n».
Ответ №1:
Классические общие элементы управления Windows требуют окончания строк DOS, rn
. Преобразуйте все эти n
символы в «быть rn
«.
Вероятно, вы можете просто сделать это в качестве быстрого взлома:
std::wstring stemp = s2ws(buffer.str());
// quick and dirty string copy with DOS to to unix conversions
std::wstring stemp2;
for (char ch : stemp) {
if (ch == 'n') {
stemp2 = "r";
}
stemp2 = ch;
}
recordin = stemp2.c_str();
SetWindowText(hEdit, recordin);
В качестве альтернативы, весьма вероятно, что ваш input.txt
файл записан в виде стандартного текстового файла Windows с rn
окончаниями строк, а среда выполнения C просто преобразует все эти rn
экземпляры в n
символы. В этом случае вы можете просто открыть файл в двоичном формате, чтобы не произошло преобразование.
Замените это:
std::ifstream t("c://file.txt");
С этим:
std::ifstream t("c://file.txt", std::ios::binary);