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

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

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

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

24.01.2014, 22:30. Просмотров 690. Ответов 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();
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2014, 22:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос когда failbit устанавливается в 1? (C++):

Как установить Failbit? - C++
Подскажите, вот перегруженный оператор istream&amp; operator&gt;&gt;(istream &amp;in, Gender &amp;G) { try { char c; ...

Не удаётся сбросить ios::failbit - C++
Всем привет! У меня вопрос следующего характера. Идущий ниже кусок кода работает не логично list&lt;int&gt; lval; vector&lt;int&gt; ivec; ...

В чём разница между состояниями потока failbit и badbit? - C++
В чём разница между failbit и badbit? Если просто просматривать ошибку ввода в моём случае, то он всегда пишет failbit (в цикле вайл при...

Как выставить failbit внутри тела перегрузки операторов ввода/вывода - C++
Доброй ночи всем! Есть вот такой код main: for(Sales_item item; std::cin &gt;&gt; item; std::cout &lt;&lt; item &lt;&lt; std::endl); И такая...

Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят? - C++
#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;sstream&gt; using namespace std; int main() { SetConsoleCP(1251); ...

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

12
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 22:36 #2
Цитата Сообщение от h_roman Посмотреть сообщение
при достижении конца файла?
Нет. При ошибке в потоке.

Добавлено через 1 минуту
Условные операторы, при проверке состояния потока, вызывают fail(), и если !fail() (fail() вернул 0), то true, т.е. проверяют только failbit и badbit, но не eofbit.
0
h_roman
1 / 1 / 0
Регистрация: 24.01.2014
Сообщений: 16
24.01.2014, 22:46  [ТС] #3
ну так почему, например, когда в файле: 1 2 3
и никаких ошибок, в консоль выводит: ios_base :: failbit set: iostream stream error ?
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 1
24.01.2014, 22:53 #4
http://www.cplusplus.com/reference/ios/ios/fail/
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 23:08 #5
Цитата Сообщение от h_roman Посмотреть сообщение
и никаких ошибок,
Что значит никаких ошибок? Выход из while() будет при ошибке в потоке. Написал же:
Цитата Сообщение от alsav22 Посмотреть сообщение
Условные операторы, при проверке состояния потока, вызывают fail(), и если !fail() (fail() вернул 0), то true, т.е. проверяют только failbit и badbit, но не eofbit.
После чтения последнего числа, будет ещё чтение, которое и вызовет ошибку.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
24.01.2014, 23:11 #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();
1
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.01.2014, 23:22 #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;
}
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
24.01.2014, 23:23 #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Всё понял, кроме этого:
имел ввиду, когда в if'e что-то типа такого
C++
1
if (std::cin >> tmp) {}
ну или
C++
1
while (fin >> temp) {}
как у тебя.
0
alsav22
24.01.2014, 23:27
  #9

Не по теме:

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

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

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

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

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Уже можно. http://www.cplusplus.com/reference/i...operator_bool/
В С++11 добавили, не знал.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 18:24
Привет! Вот еще темы с ответами:

Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию? - C++
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию? 2) правильно ли...

Когда нужно использовать &ссылки ,а когда *указатели? - C++
Желательно с примерами

Когда запускаю и ввожу параметры, то, в момент когда программа должна выполнять действие, пишет ошибку - C++
Недавно начали изучать c++. так как в школе не было программирования (преподу пофиг было) я в универе отстаю ;c Написал программу по...

Перестало выводить, когда задание списков перевел в конструкторы, когда были просто функции выводило нормально. - C++
Не могу понять почему не выводит список на экран Перестало выводить, когда задание списков перевел в конструкторы, когда были просто...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.01.2014, 18:24
Ответ Создать тему
Опции темы

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