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

Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.01.2013, 19:08     Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят? #1
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 <windows.h>
#include <stdio.h>
#include <sstream>
using namespace std;
 
 
int main() {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 istringstream  is ("10");
 
 //Хоть какого типа будет переменная temp, всё равно всё будет плохо
 int  temp;
 //float temp;
 
 is>> temp;  
 
 //Вот этот флаг, он всегда почему-то поднят
 if (is.failbit) 
   printf ("всё плохо");
 
 getchar ();
 return 0;    
}
А вот и про сам флаг инфа:
http://www.cplusplus.com/reference/i...perator%3E%3E/

В общем, ЧЯДНТ? Спасибо, кто откликнется.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.01.2013, 19:08     Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят?
Посмотрите здесь:

C++ Проблема с оператором if - почему условия всегда выполняется
C++ Ввод из строкового потока
рандомное число всегда 22.... почему ? C++
C++ Почему-то всегда выдаёт неверный ввод
Почему произведение всегда равно 0? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
15.01.2013, 19:54     Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят? #2
Цитата Сообщение от kravam Посмотреть сообщение
if (is.failbit)
так по-моему вы что-то не то проверяете. Сдается мне, что это статическая константа, и с таким же успехом можно писать std::ios::failbit.

А для проверки, например:

C++
1
2
3
4
5
if(is.rdstate() & std::ios::failbit)
    std::cout << "FAIL! ";
// или      
if(is.fail())
    std::cout << "FAIL! ";
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
15.01.2013, 20:23  [ТС]     Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят? #3
я правильно понял:
ios::rdstate возвращает статус , а ios::setstate удаляет?

И кстати, тут советуют использовать такой вот оператор:
The values passed and retrieved by these functions can be any valid combination (using the boolean or operator, "|") of the following member constants:
Но я разобрался, это неправильный совет. Ваш правильный.
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
15.01.2013, 20:40     Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят? #4
Цитата Сообщение от kravam Посмотреть сообщение
ios::setstate
Устанавливает флаг, при этом прежние флаги не снимает, например:

C++
1
std::cin.setstate(std::ios::failbit);
или сразу несколько флагов, тут как раз и нужна побитовая дизъюнкция

C++
1
std::cin.setstate(std::ios::eofbit | std::ios::failbit | std::ios::badbit);
А очистить можно std::clear. Например:

C++
1
2
3
std::cin.clear(); // очистит все флаги
std::cin.clear(std::ios::goodbit); // тоже очистит все флаги (потому что goodbit - флаг по умолчанию)
std::cin.clear(std::ios::failbit); // установит fail, а все остальные очистит
Добавлено через 8 минут
Цитата Сообщение от kravam Посмотреть сообщение
ios::rdstate возвращает статус
Можно, кстати, попробовать напечатать возвращаемое значение и увидеть, какие биты устанавливаются. Я не знаю как точно тип iostate реализован, но у меня нормально выводится как десятичное число
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cin.setstate(ios::goodbit);
cout << cin.rdstate() << "\n"; // 0
cin.clear();
 
cin.setstate(ios::badbit);
cout << cin.rdstate() << "\n"; // 1, то есть 00000001
cin.clear();
 
 
cin.setstate(ios::eofbit);
cout << cin.rdstate() << "\n"; // 2, то есть 00000010
cin.clear();    
 
cin.setstate(ios::failbit);
cout << cin.rdstate() << "\n"; // 4, то есть 00000100
cin.clear();
Yandex
Объявления
15.01.2013, 20:40     Флаг failbit для перенаправления строкового потока; почему он всегда у меня поднят?
Ответ Создать тему
Опции темы

Текущее время: 02:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru