Если я хочу прочитать файл несколько раз с командой ./run in.txt
есть прямой путь …
0- ofstream fin;
1- while (fin >> i) {...}
2- fin.clear(); fin.seekg(0);
3- while (fin >> i) {...}
Тем не менее, я хочу передать сжатый входной файл в программу. Команда
bzcat file.bz2 | ./run
и в коде, а не ofstream fin
Я должен использовать std::cin
,
while (std::cin >> i) {...}
Цикл завершается, когда bzcat отправляет последнюю строку в программу. Теперь … вопрос в том, как я могу вернуться в начальную позицию и сказать bzcat, пожалуйста, отправьте строки еще раз (от формы до конца), и я поймаю их с помощью std::cin
?!
Содержимое трубы потребляются когда они читаются, вам нужно сохранить эти значения в памяти, если вам нужен многоходовой алгоритм, вы можете распаковать и запустить файл, иначе вы можете разбить вашу программу на несколько этапов и запускать их один за другим:
// 1
std::vector<int> data;
std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
std::back_inserter(data));
// operate on data
#2
$ bunzip2 file.bz2 && ./run file.bz2
# 3
$ bzcat file.bz2 | ./stage1 | ./stage2 ...