2016-07-30 1 views
1

я получаю и ошибка при выполнении 2 последовательных freopen с, file1 содержит четное число ИнтсC++ freopen 2 файла ошибка

int x, y; 
freopen("file1", "r", stdin); 

while (cin >> x) { 
    cin >> y; 
} 

freopen("file2", "r", stdin); 
cin >> x; 
cout << x << endl; 

печать данных в 1-й файл работает отлично, а во втором случае x неправильно,

Если я прорвусь от первого цикла до достижения цели, все будет хорошо работать,

Что происходит с cin здесь?

+0

freopen является функцией библиотеки C, а не C++ библиотеки функций. –

+0

Очевидно, что состояние конца файла на 'stdin' палочки и не очищается' freopen'. На его странице руководства не говорится о том, каково это ожидаемое поведение. Вы должны получить эту работу, явно называя 'clearerr()'. –

+0

cin и >> definitievly C++ и freopen и stdin, несмотря на принадлежность к стандартной библиотеке c, могут использоваться в C++ – Christophe

ответ

2

Причина проблемы:

Беда приходит от смешения библиотеки C с библиотекой C++.

Ваш freopen() хорошо работает на stdin. Если вы напишете тот же код, используя scanf(), чтобы читать прямо на stdin, он будет работать отлично. Но ваша программа не читает stdin: она извлекает ввод от cin, используя тот факт, что cin is synchronized with stdin.

К сожалению, an error state flag таких как eof(), который устанавливается на cin потоке в конце Fo первого файла, сохранится, несмотря на втором возобновлять на подстилающем стандартном вводе.

Как решить:

Вы просто должны сбросить состояние КИН с cin.clear():

while (cin >> x) { 
    cin >> y; 
} 
cin.clear(); // <============= add this 
freopen("file2", "r", stdin); 
cin >> x; 
cout << x << endl; 

Предложение:

Там нет необходимости в C++, чтобы играть с stdin для чтения файлов через cin. Напишите свой код, используя istream. Вы можете использовать этот код либо с cin или на ifstream:

void process_input(istream &is) 
{ 
    int x, y; 
    while (is >> x) 
     cout <<x<<endl; 
} 
int main() 
{ 
    ifstream ifs1("file1"); 
    process_input (ifs1); // or cin if you prefer 
    ifstream ifs2("file2"); 
    process_input (ifs2); 
} 
Смежные вопросы