Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
h_roman
1 / 1 / 0
Регистрация: 24.01.2014
Сообщений: 16
#1

когда failbit устанавливается в 1? - C++

24.01.2014, 22:30. Просмотров 661. Ответов 12
Метки нет (Все метки)

при достижении конца файла?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try
    {
        ifstream fin("file.txt");
        fin.exceptions(ios_base::failbit);
 
        int sum = 0;
        int temp;
        while (fin >> temp)
        {
            sum += temp;
        }
        cout << sum;
    }
    catch (exception& x)
    {
        cout << x.what();
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2014, 22:30     когда failbit устанавливается в 1?
Посмотрите здесь:

Перестало выводить, когда задание списков перевел в конструкторы, когда были просто функции выводило нормально. C++
C++ Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию?
Записать условия когда является истинным , когда: C++
Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят? C++
C++ Когда используется * перед указателями, а когда нет?
Не удаётся сбросить ios::failbit C++
Как установить Failbit? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 22:36     когда failbit устанавливается в 1? #2
Цитата Сообщение от h_roman Посмотреть сообщение
при достижении конца файла?
Нет. При ошибке в потоке.

Добавлено через 1 минуту
Условные операторы, при проверке состояния потока, вызывают fail(), и если !fail() (fail() вернул 0), то true, т.е. проверяют только failbit и badbit, но не eofbit.
h_roman
1 / 1 / 0
Регистрация: 24.01.2014
Сообщений: 16
24.01.2014, 22:46  [ТС]     когда failbit устанавливается в 1? #3
ну так почему, например, когда в файле: 1 2 3
и никаких ошибок, в консоль выводит: ios_base :: failbit set: iostream stream error ?
Croessmah
Модератор
Эксперт CЭксперт С++
12891 / 7277 / 811
Регистрация: 27.09.2012
Сообщений: 17,976
Записей в блоге: 2
Завершенные тесты: 1
24.01.2014, 22:53     когда failbit устанавливается в 1? #4
http://www.cplusplus.com/reference/ios/ios/fail/
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 23:08     когда failbit устанавливается в 1? #5
Цитата Сообщение от h_roman Посмотреть сообщение
и никаких ошибок,
Что значит никаких ошибок? Выход из while() будет при ошибке в потоке. Написал же:
Цитата Сообщение от alsav22 Посмотреть сообщение
Условные операторы, при проверке состояния потока, вызывают fail(), и если !fail() (fail() вернул 0), то true, т.е. проверяют только failbit и badbit, но не eofbit.
После чтения последнего числа, будет ещё чтение, которое и вызовет ошибку.
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
24.01.2014, 23:11     когда failbit устанавливается в 1? #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Условные операторы, при проверке состояния потока, вызывают fail()
В конечном счете все сводится к вызову fail(), но технически проверка происходит так: оператор >> возвращает ссылку на поток. if'у для проверки условия нужно выражение bool, поэтому поток нужно привести к bool. Явно это сделать нельзя, поэтому, согласно стандарту, поток в итоге приводится к void*. А где-то в недрах std::istream (или где-то в предках) есть operator void *(), который может выглядеть примерно так:
C++
1
2
3
4
operator void *() const
{
    return fail() ? 0 : (void*)this;
}
поэтому код, заключенный в if () {} выполняется в случае !fail();
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 23:22     когда failbit устанавливается в 1? #7
Цитата Сообщение от h_roman Посмотреть сообщение
ну так почему, например, когда в файле: 1 2 3
и никаких ошибок, в консоль выводит: ios_base :: failbit set: iostream stream error ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
 ifstream fin("file.txt");
 if (!fin) cout << "Error!" << endl;
 else
 {
     int sum = 0;
     int temp;
     while (fin >> temp)
     {
        sum += temp;
     }
     cout << "fail = " << fin.fail() << endl;
     cout << sum << endl;
 }
 
    system("pause");
    return 0;
}
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
24.01.2014, 23:23     когда failbit устанавливается в 1? #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё понял, кроме этого:
имел ввиду, когда в if'e что-то типа такого
C++
1
if (std::cin >> tmp) {}
ну или
C++
1
while (fin >> temp) {}
как у тебя.
alsav22
24.01.2014, 23:27
  #9

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
имел ввиду, когда в if'e что-то типа такого
Уже разобрался, я же сам это написал:
Цитата Сообщение от alsav22 Посмотреть сообщение
и если !fail() (fail() вернул 0), то true,

h_roman
1 / 1 / 0
Регистрация: 24.01.2014
Сообщений: 16
25.01.2014, 15:48  [ТС]     когда failbit устанавливается в 1? #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Что значит никаких ошибок?
имею в виду никаких ошибок в файле)

Цитата Сообщение от alsav22 Посмотреть сообщение
После чтения последнего числа, будет ещё чтение, которое и вызовет ошибку.
я не очень понимаю
разве не должен только eofbit установиться в 1 после чтения последнего числа?
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.01.2014, 17:03     когда failbit устанавливается в 1? #11
Цитата Сообщение от h_roman Посмотреть сообщение
разве не должен только eofbit установиться в 1 после чтения последнего числа?
Установится и что? Вы читайте внимательно, что пишут:
Цитата Сообщение от alsav22 Посмотреть сообщение
Условные операторы, при проверке состояния потока, вызывают fail(), и если !fail() (fail() вернул 0), то true, т.е. проверяют только failbit и badbit, но не eofbit.
eofbit установится, но failbit (который условные операторы проверяют) нет, поэтому выхода из while() не будет, будет ещё одна итерация. Попытка чтения, при установленном eofbit, приведёт к ошибке в потоке, установится failbit, в результате произойдёт выход и while().

Добавлено через 1 минуту
Цитата Сообщение от h_roman Посмотреть сообщение
имею в виду никаких ошибок в файле)
Это, кстати, что такое: ошибки в файле?
Tulosba
:)
Эксперт С++
4391 / 3234 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.01.2014, 17:10     когда failbit устанавливается в 1? #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
поток нужно привести к bool. Явно это сделать нельзя
Уже можно. http://www.cplusplus.com/reference/i...operator_bool/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 18:24     когда failbit устанавливается в 1?
Еще ссылки по теме:

Когда использовать WinAPI, а когда функции языка? C++
C++ Когда оператор должен быть обязательно членом класса, и когда он обязательно не принадлежит классу?
В чём разница между состояниями потока failbit и badbit? C++
Когда стоит использовать класс, а когда лучше обойтись без них? C++
C++ Когда запускаю и ввожу параметры, то, в момент когда программа должна выполнять действие, пишет ошибку

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
25.01.2014, 18:24     когда failbit устанавливается в 1?
  #13

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
В С++11 добавили, не знал.

Yandex
Объявления
25.01.2014, 18:24     когда failbit устанавливается в 1?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru