freopen () эквивалент для потоков C ++ - PullRequest
19 голосов
/ 10 марта 2011

При программировании с вводом-выводом в стиле c я иногда использую freopen (), чтобы повторно открыть стандартный ввод для тестирования, чтобы мне не приходилось вводить ввод снова и снова. Мне было интересно, если есть эквивалент для потоков ввода-вывода C ++. Кроме того, я знаю, что могу использовать каналы, чтобы перенаправить его в командную строку / терминал / whatitis, но мне было интересно, есть ли способ сделать это внутри моего кода (потому что, как вы можете видеть, я не очень хорошо осведомлен кл / т / б).

Ответы [ 3 ]

30 голосов
/ 10 марта 2011

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

Редактировать: Из стандарта C ++ 27.3.1:

Объект cin управляет вводом из буфера потокасвязанный с объектом stdin, объявленным в <cstdio>.

Таким образом, согласно стандарту, если мы перенаправим stdin, он также перенаправит cin.Наоборот cout.

14 голосов
/ 12 марта 2011
#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/

1 голос
/ 10 марта 2011

В этом сообщении группы новостей рассматриваются ваши варианты.

Это зависит от системы, и на плакате не указано система, но cin.clear () должен работать. Я проверил прилагаемый программа в системе UNIX с AT & T версиями iostreams.

#include <iostream.h>
int main()
{
    for(;;) {
        if ( cin.eof() ) {
            cout << "EOF" << endl;
            cin.clear();
        }
        char c ;
        if ( cin.get(c) ) cout.put(c) ;
    }
} 

Да, это нормально работает в cfront и TC ++. В 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 "reopen cin c ++", второй результат.)

Дайте нам знать, как вы поживаете. Вы также можете просто использовать freopen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...