Проблема с текстом окна набора C

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