Getline разрывается при чтении специальных символов в строку - PullRequest
0 голосов
/ 10 июня 2018

В качестве упражнения я делаю простой словарный тренажер.Файл, который я читаю, содержит словарь, который также содержит специальные символы, такие как, например, äöü.

Однако я изо всех сил пытался прочитать этот файл, не получая искалеченных символов вместо подходящих специальных символов.

Я понимаю, почему это происходит, но не как правильно ее решить.

Вот моя попытка:

Unit(const char* file)
:unitName(getFileName(file),false){
    std::wifstream infile(file);
    std::wstring  line;
    infile.imbue(std::locale(infile.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff, std::consume_header>()));
    while (std::getline(infile, line))
    {

        std::wcout<<line.c_str()<<"\n";
        this->vocabulary.insert(parseLine(line.c_str(),Language::EN_UK,Language::DE));
    }

}

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

Я даже смог немного изменить код, чтобы увидеть, где именно он перестает читать:

while (infile.eof()==false)
{
    std::getline(infile, line);
    std::wcout<<line.c_str()<<"\n";
    this->vocabulary.insert(parseLine(line.c_str(),Language::EN_UK,Language::DE));
}

Если я делаю это так, цикл выводазапись со специальным символом, но перестает выводить ее прямо перед тем, как специальный символ будет выглядеть следующим образом:

Instead of:
cross-class|klassenübergreifend 
It says:
cross-class|klassen
cross-class|klassen
cross-class|klassen
cross-class|klassen
.
.
.

это заставляет меня поверить, что специальный символ неправильно интерпретируется как конец строки в getline.

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

Как правильно и аккуратно читать файл utf-8 построчно?


ПримечаниеЯ искал другие статьи здесь, но большинство из них либо используют getline, либо просто объясняют, почему, но не как это решить.

...