ab.random
27-02-2012, 03:19
Задание.
Напишите функцию, получающую и возвращающую ссылку на объект класса istream. Функция должна читать данные из потока до тех пор, пока не будет достигнут конец файла. Функция должнавыводить прочитанные данные на устройство вывода. Перед возвращением потока верните все её флаги в допустимое состояние. Проверьте созданную функцию, передав ей объект cin в качестве аргумента. (Липпман, Язык программирования С++. Вводный курс. 4-ое издание, Упражнение 8.3, 8.4, стр 317).
Вопрос.
При вводе цифры или знака конца файла (Ctrl+Z), функция срабатывает как положено. Но при вводе символа, функция бесконечно выдает сообщение об ошибке, хотя должна пропустить итерацию и снова запросить ввод данных. Почему так происходит, в чем ошибка?
Заранее спасибо.
#include <cstdlib>
#include <iostream>
#include <istream>
using namespace std;
istream &funk(istream &mycin){
int ival=0;
while (mycin >> ival, !mycin.eof()){
if (mycin.bad()){
cerr << "Error of stream!" << endl;
break;
}
if (mycin.fail()){
cerr << "Bad data, try again\n"; // выводится в бесконечном цикле
mycin.clear(istream::failbit);
continue;
}
cout << "You entered " << ival << endl;
}
mycin.clear();
return mycin;
}
int main(int argc, char *argv[]){
funk(cin);
system("PAUSE");
return EXIT_SUCCESS;
}
Пробовал вычислить ошибку, проверяя косячный if:
if (mycin.fail()){
cerr << "Bad data, try again\n";
mycin.clear(istream::failbit); // с таким параметром флаг не сбрасывается вообще
// если clear() использовать без параметра флаг сбрасывается,
// но зацикливание остается
if (!mycin.fail()) cout << "Clear" << endl;
else cout << "No_clear" << endl;
system("pause");
continue;
}
Напишите функцию, получающую и возвращающую ссылку на объект класса istream. Функция должна читать данные из потока до тех пор, пока не будет достигнут конец файла. Функция должнавыводить прочитанные данные на устройство вывода. Перед возвращением потока верните все её флаги в допустимое состояние. Проверьте созданную функцию, передав ей объект cin в качестве аргумента. (Липпман, Язык программирования С++. Вводный курс. 4-ое издание, Упражнение 8.3, 8.4, стр 317).
Вопрос.
При вводе цифры или знака конца файла (Ctrl+Z), функция срабатывает как положено. Но при вводе символа, функция бесконечно выдает сообщение об ошибке, хотя должна пропустить итерацию и снова запросить ввод данных. Почему так происходит, в чем ошибка?
Заранее спасибо.
#include <cstdlib>
#include <iostream>
#include <istream>
using namespace std;
istream &funk(istream &mycin){
int ival=0;
while (mycin >> ival, !mycin.eof()){
if (mycin.bad()){
cerr << "Error of stream!" << endl;
break;
}
if (mycin.fail()){
cerr << "Bad data, try again\n"; // выводится в бесконечном цикле
mycin.clear(istream::failbit);
continue;
}
cout << "You entered " << ival << endl;
}
mycin.clear();
return mycin;
}
int main(int argc, char *argv[]){
funk(cin);
system("PAUSE");
return EXIT_SUCCESS;
}
Пробовал вычислить ошибку, проверяя косячный if:
if (mycin.fail()){
cerr << "Bad data, try again\n";
mycin.clear(istream::failbit); // с таким параметром флаг не сбрасывается вообще
// если clear() использовать без параметра флаг сбрасывается,
// но зацикливание остается
if (!mycin.fail()) cout << "Clear" << endl;
else cout << "No_clear" << endl;
system("pause");
continue;
}