Поскольку вы видели что-то вроде: ■ aaaaaaa 1 ♦ 1 ♦ 1 ♦ 1 ♦ 1 ♦ 1 ♦ 1 ♦ 2 ♦ 2 ♦ 2 ♦ 2 ♦ 2 ♦ 2 ♦ 2 ♦ выводится на консоль, кажется, чтозакодирован в кодировке UTF-16, вероятно, UTF-16 LE + BOM .Вы можете использовать свой исходный код, если измените кодировку файла на UTF-8.
Причина использования UTF-8 состоит в том, что независимо от типа символа потока файла basic_fstream
базовый basic_filebuf
использует объект codecvt
для преобразования потока объектов char
в / из потока объектов типа char;т.е. при чтении поток char
, считываемый из файла, преобразуется в поток wchar_t
, но при записи поток wchar_t
преобразуется в поток char
, который затем записывается в файл.В случае std::wifstream
объект codecvt
является экземпляром стандарта std::codecvt<wchar_t, char, mbstate_t>
, который обычно преобразует UTF-8 в UCS-16.
Как объяснено на на странице документации MSDNдля basic_filebuf
:
Объекты типа basic_filebuf создаются с внутренним буфером типа char * независимо от char_type , определенного параметромвведите параметр Элем .Это означает, что строка Unicode (содержащая символы wchar_t) будет преобразована в строку ANSI (содержащую символы char) перед записью во внутренний буфер.
Аналогично, при чтении строки Unicode (содержащейwchar_t
символов), basic_filebuf
преобразует строку ANSI, считанную из файла, в строку wchar_t
, возвращаемую в getline
и другие операции чтения.
Если изменить кодировку input.txt
наUTF-8, ваша оригинальная программа должна работать правильно.
Для справки, это работает для меня:
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
int main()
{
using namespace std;
vector<wstring> inputVector;
wstring inputString, result;
wifstream inputStream;
inputStream.open("input.txt");
while(!inputStream.eof())
{
getline(inputStream, inputString);
inputVector.push_back(inputString);
}
inputStream.close();
srand(time(NULL));
int numLines = rand() % inputVector.size();
for(int i = 0; i < numLines; i++)
{
int randomLine = rand() % inputVector.size();
result += inputVector[randomLine];
}
wofstream resultStream;
resultStream.open("result.txt");
resultStream << result;
resultStream.close();
return EXIT_SUCCESS;
}
Обратите внимание, что кодировка result.txt
также будет UTF-8 (обычно).