Эквивалент freopen() для потоков С++
При программировании с использованием ввода-вывода c-style иногда я использую freopen() для повторного открытия stdin для целей тестирования, так что мне не нужно повторно вводить ввод снова и снова. Мне было интересно, есть ли эквивалент для потоков i/o С++. Кроме того, я знаю, что я могу использовать каналы для перенаправления его в командной строке/терминале/anyitis, но мне было интересно, есть ли способ сделать это внутри моего кода (потому что, как вы можете видеть, я не очень хорошо осведомлен о кл/т/б).
Ответы
Ответ 1
freopen
также работает с cin
и cout
. Нет необходимости искать что-то новое.
freopen("input.txt", "r", stdin); // redirects standard input
freopen("output.txt", "w", stdout); // redirects standard output
int x;
cin >> x; // reads from input.txt
cout << x << endl; // writes to output.txt
Изменить: Из стандарта С++ 27.3.1:
Объект cin управляет входом из буфера потока, связанного с объектом stdin, объявленным в <cstdio>
.
Итак, согласно стандарту, если мы перенаправим stdin
, он также перенаправит cin
. И наоборот, для cout
.
Ответ 2
#include <iostream>
#include <fstream>
int main() {
// Read one line from stdin
std::string line;
std::getline(std::cin, line);
std::cout << line << "\n";
// Read a line from /etc/issue
std::ifstream issue("/etc/issue");
std::streambuf* issue_buf = issue.rdbuf();
std::streambuf* cin_buf = std::cin.rdbuf(issue_buf);
std::getline(std::cin, line);
std::cout << line << "\n";
// Restore sanity and read a line from stdin
std::cin.rdbuf(cin_buf);
std::getline(std::cin, line);
std::cout << line << "\n";
}
http://www.cplusplus.com/reference/iostream/ios/rdbuf/
Ответ 3
Эта публикация в группе новостей исследует ваши варианты.
Это зависит от системы, и плакат не указывал системы, но cin.clear() должен работать. Я протестировал прилагаемый программа в системе UNIX с версией iostreams AT & T.
#include <iostream.h>
int main()
{
for(;;) {
if ( cin.eof() ) {
cout << "EOF" << endl;
cin.clear();
}
char c ;
if ( cin.get(c) ) cout.put(c) ;
}
}
Да, это хорошо работает в cfront и TС++. В g++, где сначала возникла проблема, требуется дополнительное действие:
cin.clear();
rewind ( _iob ); // Seems quite out of place, doesn't it?
// cfront also accepts but doesn't
// require this rewind.
Хотя я отмечаю, что это было в 1991 году, оно все равно должно работать. Не забудьте использовать стандартный iostream
заголовок, а не iostream.h
.
(Кстати, я обнаружил, что сообщение с условиями поиска Google "повторно открыть cin С++", второй результат.)
Сообщите нам, как вы поживаете. Вы также можете использовать freopen
.