В связанном потоке итерация за кадром строка за строкой , цитируемом выше, Джерри Коффин описал «еще одну возможность (которая) использует часть стандартной библиотеки, о которой большинство людей даже не подозревают. " Следующее применяет этот метод (именно то, что я искал) для решения проблемы итерации по файлу построчно, как было запрошено в текущем потоке.
Сначала фрагмент, скопированный непосредственно из ответа Джерри в соответствующей теме:
struct line_reader: std::ctype<char> {
line_reader(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask());
rc['\n'] = std::ctype_base::space;
return &rc[0];
}};
А теперь добавьте в ifstream пользовательский языковой стандарт, описанный Джерри, и скопируйте его из infstream в ofstream.
ifstream is {"fox.txt"};
is.imbue(locale(locale(), new line_reader()));
istream_iterator<string> ii {is};
istream_iterator<string> eos {};
ofstream os {"out.txt"};
ostream_iterator<string> oi {os,"\n"};
vector<string> lines {ii,eos};
copy(lines.begin(), lines.end(), oi);
Выходной файл ("out.txt") будет точно таким же, как и входной файл ("fox.txt").