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

проверка переданных данных из потока ввода - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 12:00     проверка переданных данных из потока ввода #1
Здорова!

От допустим у нас есть три переменные int i, double d и char c.
Нужно проверить что находится в потоке ввода, какой тип данных, если int то записать в int, если double , то в double и чар в чар. Как это сделать? Я ж не могу просто так cin >>i; или cin >>c; а в потоке несколько символов.

И в cin строка наверно ж находится?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 12:00     проверка переданных данных из потока ввода
Посмотрите здесь:

Проверка ввода данных C++
Проверка ввода данных в консоле C++
C++ Проверка ввода данных в C++
Проверка ввода данных в C++ C++
Ввод данных в string, очистка потока ввода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 12:06     проверка переданных данных из потока ввода #2
ну как читаем строку, потом используем такой класс
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
TypeConvertors::TypeConvertors()
{
}
 
TypeConvertors::~TypeConvertors()
{
}
 
/**
    Получить строку из int
 
*/
string TypeConvertors::getString(int x)
{
    stringstream r;
    r << x;
    return r.str();
}
 
/**
    Получить строку из float
 
*/
string TypeConvertors::getString(const float &s)
{
    stringstream ss;
    string res;
    ss << s;
    ss >> res;
    return res;
}
 
/**
    Получить строку из double
 
*/
string TypeConvertors::getString(const double &s)
{
    stringstream ss;
    string res;
    ss << s;
    ss >> res;
    return res;
}
 
/**
    Получить int из строки
 
*/
int TypeConvertors::getInt(const string &s)
{
    stringstream ss;
    int d;
    ss << s;
    ss >> d;
    return d;
}
 
/**
    Получить double из строки
 
*/
double TypeConvertors::getDouble(const string &s)
{
    stringstream ss;
    double d;
    ss << s;
    ss >> d;
    return d;
}
 
/**
    Получить float из строки
 
*/
float TypeConvertors::getFloat(const string &s)
{
    stringstream ss;
    float d;
    ss << s;
    ss >> d;
    return d;
}
 
}
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
17.08.2013, 12:17     проверка переданных данных из потока ввода #3
C++
1
std::istream::peek
, не решает всех проблем ТС, но должно помочь.
Тут даже в качестве примера приводится похожая ситуация.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 12:32  [ТС]     проверка переданных данных из потока ввода #4
XRuZzz, А если неизвестно что я прочитал число или строку. От как определить что в cin находится или там всегда будет строка?

Добавлено через 6 минут
Fyret, Да извлеч из потока символ и проверить что за символ, да я видел те примеры. Вообще нужно как бы общую программку написать для ввода разных типов, например для типов: имена файлов, дата, и т.д. по своему обрабатывать эти данные.
Ладно предположим что в потоке cin данные хронятся в виде строки, то что тогда? Тогда получается что нам нужно вручную извлечь данные в строку, а затем уже саму эту строку обрабатывать проверять имя файла это или это дата, а мб это дабл, просто разобрать строку, а затем уже преобразовать как XRaZzz написал. Правильно ж?????

Добавлено через 2 минуты
Так в cin наврятли строка почему же тогда получается прочитать?
C++
1
2
int a;
cin >>a;
??????
0x10
17.08.2013, 12:38
  #5

Не по теме:

Зафиксировать формат входных данных и не греть голову. Универсальная программа, которая прожует любые данные в любой последовательности никому не нужна, да и будет сложнее в тестировании, т.к. с появлением каждого нового поля возрастает количество возможных перестановок значений на входе.

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 12:50  [ТС]     проверка переданных данных из потока ввода #6
Ладно похоже лучше ничего не придумать чем считать данные в строку string обработать эту строку и вызвать нужную функцию например f(int) или f(name_file), смотря что в строке находится.
Мб кто то что то знает?

Добавлено через 10 минут
0x10, Так это в целях обучения и не универсальная, там для 5 хотя бы типов данных int, double, float, file_name и data. От как мне делать правильно? По другому нельзя кроме как в строку считать данные обработать и вызвать нужную функцию которая допустим сынициализирует класс.
От примерно так:
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
25
26
27
28
29
30
31
32
struct p
{
int i;
double d;
 
void f(int x){i=x;}
void f(doube x){d=x;}
 
istream& operator>>(istream& in,p& e)
{
string s;
in >>s;
int pos=s.fined('.');
if(pos!=string::npos)
{
//целое число
//то нужно назад все в поток поместить либо строку в число преобразовать. 
//или как чувак предолжил в sstream
sstirngstream ss
ss <<s;
ss >>i;
}
else
{
//преобразовываем в double либо как чувак предложил
sstringstream ss
ss <<s;
ss >>d;
}
 
}
}
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 12:52     проверка переданных данных из потока ввода #7
C++
1
2
int a;
cin >>a;
так учат в учебниках по программированию.
ну подумайте сами, что можно ожидать от пользователя?
только бесмысленный набор символов
типа sdfdsafdasfas/zx11``\
поэтому
C++
1
2
std::string userInput;
cin >>userInput;
далее мы не конвертируем строку в int или double, как могло показаться в первом моём посте.
далее мы используем регулярное выражение (из boost::regexp или из стандартной библиотекиC++11)
для sdfdsafdasfas/zx11``\
мы тут можем увидеть, число или флаг /z
но лучше сказать пользователю, что неплохо было бы пробелы поставить и удалить бесмысленные символы
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
17.08.2013, 12:52     проверка переданных данных из потока ввода #8
теоретически возможны строки вида ”2525555.556.66” или ”56аапрр”, т.е. ничего кроме считывания строки и ее разбора не предвидется.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 12:53  [ТС]     проверка переданных данных из потока ввода #9
и в таком духе придумать для file_name и data просто у них должны быть конструкторы преобразования из string или char*
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 12:57     проверка переданных данных из потока ввода #10
вам нужно показать как регулярками пользоваться?
для изучения подходит linux консоль и программа grep
потому, что консоль без регулярок в линухе мало кто использует.
писать код для проверки строки, без регулярных выражений пустая трата времени.(если вы не пишите универсальные классы, которые позволяют заменить регулярки)
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 13:00  [ТС]     проверка переданных данных из потока ввода #11
Цитата Сообщение от XRuZzz Посмотреть сообщение
так учат в учебниках по программированию.
ну подумайте сами, что можно ожидать от пользователя?
Да я тоже над этим не задумывался, бывает должно ввестись int но пользователь вводит символ и программа взрывается, ну это когда двумерный массив обрабатываем там мелкий int от 0 до 10 и все бесконечный цикл, я сразу и не понимал чо оно так зацикливалось, потом токо понял что символ это число большее верхних границ массива.

А вообще отета штука прикольная sstringstream считали строку преобразовали в int, считали строку преобразовали в double или в float. Токо щас понял, а до этого мучился все в ручную делал.

Добавлено через 1 минуту
Цитата Сообщение от XRuZzz Посмотреть сообщение
вам нужно показать как регулярками пользоваться?
для изучения подходит linux консоль и программа grep
Да нет спс я РВ знаю что такое, я на пхп свой парсер делал, генератор сайтов и книгу по РВ фридла прочитал.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 13:02     проверка переданных данных из потока ввода #12
вы наверно не смотрели лекции на которые я даю ссылку Для того чтобы выучить С++ по книге Бьёрна Страуструпа а там доходчиво рассказывается как пользоваться(и как устроены) си-шными функции для работы со строками типа strtok, и многое другое.
думаю после просмотра у вас не должно остаться таких вопросов.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 13:06  [ТС]     проверка переданных данных из потока ввода #13
Я еще хочу написать на С++ генератор ГС или дорвеев и свою CMS доработать с использованием SQlite что бы без mysql и начать клепать тонами доры или гсы. Ну это так первый мой большой проект будет, как токо Страуструпа дочитаю. Уже не терпится начать писать. И к ПХП охота вернутся.

Добавлено через 1 минуту
XRuZzz,
Цитата Сообщение от XRuZzz Посмотреть сообщение
вы наверно не смотрели лекции на которые я даю ссылку Для того чтобы выучить С++ по книге Бьёрна Страуструпа а там доходчиво рассказывается как пользоваться(и как устроены) си-шными функции для работы со строками типа strtok, и многое другое.
думаю после просмотра у вас не должно остаться таких вопросов.
Так я знаю как они работают strtok разбивает на слова. strcmp сравнивает строки и возвращает 0 если раны strcpy копирует строки strcat объединяет строки.

Добавлено через 42 секунды
XRuZzz, Я уже заканчиваю Страуструпа читать 21 главу прохожу.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 13:07     проверка переданных данных из потока ввода #14
Цитата Сообщение от ninja2 Посмотреть сообщение
Я еще хочу написать на С++ генератор ГС или дорвеев и свою CMS доработать с использованием SQlite что бы без mysql и начать клепать тонами доры или гсы. Ну это так первый мой большой проект будет, как токо Страуструпа дочитаю. Уже не терпится начать писать. И к ПХП охота вернутся.
та же фигня между PHP и C++ застрял. но от MySQL я пытаюсь отойти в сторону NoSQL(модное течение в данный момент)
знаете, что я думаю по поводу ГС?
http://ru.wikipedia.org/wiki/%D0%93%D0%A1
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 13:17  [ТС]     проверка переданных данных из потока ввода #15
Цитата Сообщение от XRuZzz Посмотреть сообщение
та же фигня между PHP и C++ застрял. но от MySQL я пытаюсь отойти в сторону NoSQL(модное течение в данный момент)
Я от бд отойти не хочу просто sqlite это как бы бд (я сильно не вникал) токо как бы базу не нужно устанавливать на сервер, или самому сделать CMS на текстовых файлах. ГС - это гамносайт.
Без бд чтобы если сгенерировал 100 качественных ГС, что бы не мучится с настройкой бд, а просто по фтп скопировал на сервер файлы и все не паришся.
Лучше конечно sqlite потому что можно расширить и написать громадную систему. А на текстовых файлах самому придумывать структуру для нового модуля.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 13:17     проверка переданных данных из потока ввода #16
Цитата Сообщение от ninja2 Посмотреть сообщение
XRuZzz, Я уже заканчиваю Страуструпа читать 21 главу прохожу.
ну конечно, нормальная версия книги тока в мае 2013 вышла
The C++ Programming Language (4th Edition)

фиг её дочитаешь, с самыми современными фичами. если читать по англ, то шансы дочитать последнее издание повышаются.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 13:21  [ТС]     проверка переданных данных из потока ввода #17
У меня специальное издание 2010 год, тоже фиг дочитаешь замучила уже.
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
17.08.2013, 13:30     проверка переданных данных из потока ввода #18
Это если Кнута читаешь, то можно не перечитывать последние издания, а большинство книг быстро теряют актуальность.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 13:37  [ТС]     проверка переданных данных из потока ввода #19
Цитата Сообщение от XRuZzz Посмотреть сообщение
Это если Кнута читаешь, то можно не перечитывать последние издания, а большинство книг быстро теряют актуальность.
2010 года издание я думаю актуальна, а в этой новой наверно стандарт 2011 добавлен и все, а все остальное то же самое.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 14:07     проверка переданных данных из потока ввода
Еще ссылки по теме:

C++ проверка ввода данных
Контроль ввода данных из потока C++
Проверка ввода данных C++

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

Или воспользуйтесь поиском по форуму:
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.08.2013, 14:07     проверка переданных данных из потока ввода #20
Цитата Сообщение от ninja2 Посмотреть сообщение
в этой новой наверно стандарт 2011 добавлен и все, а все остальное то же самое
Вообще мелочевка.
Yandex
Объявления
17.08.2013, 14:07     проверка переданных данных из потока ввода
Ответ Создать тему
Опции темы

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