Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проверить что std::cin прочитал то что нужно? 
:(
    Опции темы
versus
Дата 8.3.2005, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.3.2005
Где: Переславль-Залесс кий

Репутация: нет
Всего: 3



Всем привет.

Имеется вот такой код:

Код

#include <stdio.h>

int main()
{
   int tmp;

   printf("status: %d\n", scanf("%d", &tmp));

   return 0;
}


Как переписать его на С++ используя потоковую модель?
Другими словами, как проверить что std::cin >> tmp прочитал то что нужно?
PM MAIL WWW   Вверх
NiJazz
Дата 8.3.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 1
Всего: 23



Цитата
Как переписать его на С++ используя потоковую модель?

Код

#include <iostream>

using namespace std;

int main()
{
   int tmp;

   //printf("status: %d\n", scanf("%d", &tmp));
   cin >> tmp;
   cout << tmp;    

   return 0;
}


Это сообщение отредактировал(а) NiJazz - 8.3.2005, 13:35
PM MAIL   Вверх
versus
Дата 8.3.2005, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.3.2005
Где: Переславль-Залесс кий

Репутация: нет
Всего: 3



Боюсь что это не совсем то что мне нужно...

Вот как ведет себя C-шный вариант программы:
versus@dot:$ ./a.out
lala
status: 0
versus@dot:$ ./a.out
10
status: 1

scanf возвращает количество успешно считанных (в смысле соотвествия форматной строке) аргументов. Исходя из этого количества можно, например, предпринять повторную попытку считать значение. Можно ли получить аналогичную информацию из cin ?

Это сообщение отредактировал(а) versus - 8.3.2005, 13:45
PM MAIL WWW   Вверх
np9mi7
Дата 8.3.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Может не в тему: ты как хочешь валидность ввода проверять?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
versus
Дата 8.3.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.3.2005
Где: Переславль-Залесс кий

Репутация: нет
Всего: 3



arajan, да мне бы хоть как нибудь... вот ведь scanf (из примера) как то может распознать что ему дают char вместо int.

Хорошо было бы если после чтения из потока переменная содержала бы какое-нибудь осмысленное значение своего типа, а в случае если ввод явно некорректный (например я жду double а мне суют char) сигнализировала об этом особым значением или каким-то иным образом. Ну не может быть что потоки не реализуют такую функциональность !
PM MAIL WWW   Вверх
np9mi7
Дата 8.3.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



нет, потоки эту функциональность не реализиют... (я могу ошибаться... smile )....
где пишешь, среда разработки?
попробуй конвертить в тип который тебе нужен, а при возникновении ошибки говори что ввод не правильный...

так где пишешь?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
versus
Дата 8.3.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.3.2005
Где: Переславль-Залесс кий

Репутация: нет
Всего: 3



g++ 3.3.5

похоже что в случае, когда cin читает значение не того типа, он просто не присваивает нового значения указанной справа переменной:

Код

#include <iostream>
using namespace std;

int main()
{
   int tmp = 3; // magic constant :-)

   cin >> tmp;
   cout << tmp << endl;

   return 0;
}


versus@dot:$ ./a.out
lala
3

versus@dot:$ ./a.out
123
123

Это сообщение отредактировал(а) versus - 8.3.2005, 17:17
PM MAIL WWW   Вверх
np9mi7
Дата 8.3.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



ну так пиши так
Код

#include <iostream>
using namespace std;
int main()
{
char *tmp = new char [255];
cin>>tmp;
cout<<tmp<< endl;
return 0;
}


и ваще, тебе какой тип нужно в итоге получить?
говорю, можно так

Код

#include <iostream>
using namespace std;
int main()
{
char *tmp = new char [255];
       ТОТ_СЛАВНЫЙ_ТИП a;
cin>>tmp;
try
{
                   a = КОНВЕРТИРУЮ_КУДА_МНЕ_НУЖНО (tmp);
}
catch(...)
{
                   cout<<"Enter error!!!"<<endl;
                   return 1;
}
cout<<tmp<<endl;
return 0;
}


Это сообщение отредактировал(а) arajan - 8.3.2005, 17:30


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
pablo
Дата 8.3.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Корче говоря тот кусок кода который вы представили работает только один раз, т.е после выброса исключения поток ввода будет закрыт, а это не хорошо.
Если счтывание прозошло не удачно, то лучше явно выбросить исключение invalid_argument, перед этим отчистив поток для дальнейшего чтения.

И кстати если вы обрабатываете есключения, то гораздо предпочтительнее здесь полиморфный подход, но это просто техническое замечание. smile

Цитата
  нет, потоки эту функциональность не реализиют... (я могу ошибаться... smile )....
где пишешь, среда разработки?
попробуй конвертить в тип который тебе нужен, а при возникновении ошибки говори что ввод не правильный...


Вы ошибаетесь, причём очень.
Для подобных приблем есть исключения.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
np9mi7
Дата 8.3.2005, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



pablo, пример!!! smile , где они реализиют эту функциональность...


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
pablo
Дата 8.3.2005, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Код

#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::invalid_argument;
using std::exception;
using std::getline;

int main()
{
   int chislo;
   cout << "Vvedite chislo" << endl;

   try
   {
        cin >> chislo;
        if(cin.fail())
        {
               cin.clear();
              string badValue;
              getline(cin, badvalue)';
              throw invaluid_argument( "Ne verno vvedeny dannye" + badVaue);
         
        }
   }
   catch(exception &a)
   {
     cout << a.what() << endl;
   }
   return 0;
}






Вот что я имел ввиду.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
np9mi7
Дата 8.3.2005, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Код

cin.fail();

согласен....

хотя, чето в VC я у CIN этого метода не нашел.... smile

все это отмазы....

Это сообщение отредактировал(а) arajan - 8.3.2005, 22:32


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
pablo
Дата 8.3.2005, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Ето не в VC, это стандартный способ выявления ошибок.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
np9mi7
Дата 8.3.2005, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Да не про EXEPTIONS, а про cin.fail().......
Добавлено @ 22:38
Цитата

Standard C++ Library Reference 

ios_base MembersSee Also
ios_base Class | Thread Safety in the Standard C++ Library
Typedefs

event  Specifies event types.
event_callback  Describes a function passed to register_call.
fmtflags  Constants to specify the appearance of output.
iostate  Defines constants describing the state of a stream.
openmode  Describes how to interact with a stream.
seekdir  Specifies starting point for offset operations.

Member Functions

failure  The member class serves as the base class for all exceptions thrown by the member function clear in template class basic_ios.
flags  Sets or returns the current flag settings.
getloc  Returns the stored locale object.
imbue  Changes the locale.
Init  Creates the standard iostream objects when constructed.
ios_base  Constructs ios_base objects.
iword  Assigns a value to be stored as an iword.
precision  Specifies the number of digits to display in a floating-point number.
pword  Assigns a value to be stored as a pword.
register_callback  Specifies a callback function.
setf  Sets the specified flags.
sync_with_stdio  Ensures that iostream and C run-time library operations occur in the order that they appear in source code.
unsetf  Causes the specified flags to be off.
width  Sets the length of the output stream.
xalloc  Specifies that a variable shall be part of the stream.

Operators

operator= 


Добавлено @ 22:40
хотя,
Цитата

class ios { //ios является базовым для ostream и istream
        //...
    public:
        int eof() const;    // дошли до конца файла
        int fail() const;    // следующая операция будет неудачна
        int bad() const;    // поток испорчен
        int good() const;    // следующая операция будет успешной
        //...
    };

Б. Страуструп
где правда smile ???

Это сообщение отредактировал(а) arajan - 8.3.2005, 22:41


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
versus
Дата 8.3.2005, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.3.2005
Где: Переславль-Залесс кий

Репутация: нет
Всего: 3



pablo, спасибо!
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.