проблема seekg с использованием wifstream и UTF16-LE - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующий код:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <locale>
#include <codecvt>


int _tmain(int argc, _TCHAR* argv[])
{
  std::wifstream fin;
  std::locale loc_utf_16(fin.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, (std::codecvt_mode)(std::consume_header | std::little_endian)>);
  fin.imbue(loc_utf_16);
  fin.open("PathToUTF16File.txt", std::ios::binary);

  if (!fin.is_open())
  {
    return 1;
  }

  std::wstring readLine;
  while(!fin.eof())
  {
     readLine += fin.peek();
     fin.seekg(0, fin.cur);
  }

  fin.close();

  return 0;
}

, в котором я читаю закодированный файл utf16-LE. Если я использую приведенный выше код, я правильно заполняю переменную wstring readLine. Но мне интересно, почему это работает? Из документации это не должно работать, потому что при использовании метода peek просто считывается символ в текущей позиции, а использование seekg (0, fin.cur) не должно перемещать текущую позицию в потоке. Как правильно получить каждый символ из исходного потока, не потребляя его (т.е. не используя метод get ()). Конечно, это могут быть русские, арабские c и китайские символы. Спасибо всем

...