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

std::cin - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.85
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
02.09.2011, 21:06     std::cin #1
C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 std::cout<<(std::cin>>buf);
 return 0;
}
Я в консоли вижу странный вывод и не пойму что это есть такое? Что возвращает выражение скобках?
Где найти детальную информацию про работу с объектом cin?

C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 while (std::cin>>buf) std::cout<<buf<<std::endl;
 return 0;
}
Почему если в данном случае ввести строку "a b c d" тело выполнится 4 раза, и я получу на выходе
a
b
c
d
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
02.09.2011, 21:08     std::cin #2
Цитата Сообщение от AlexH Посмотреть сообщение
Код C++1
2
3
4
5
6
7 const int MAX = 256;
int main()
{
char buf[MAX];
while (std::cin>>buf) std::cout<<buf<<std::endl;
return 0;
}
Почему если в данном случае ввести строку "a b c d" тело выполнится 4 раза, и я получу на выходе
a
b
c
d
Спасибо.
cin считывает до разделителя - /n /t и т.д.
Сыроежка
Заблокирован
02.09.2011, 21:13     std::cin #3
Цитата Сообщение от AlexH Посмотреть сообщение
C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 std::cout<<(std::cin>>buf);
 return 0;
}
Я в консоли вижу странный вывод и не пойму что это есть такое? Что возвращает выражение скобках?
Где найти детальную информацию про работу с объектом cin?

C++
1
2
3
4
5
6
7
const int MAX = 256;   
int main()
{
 char buf[MAX]; 
 while (std::cin>>buf) std::cout<<buf<<std::endl;
 return 0;
}
Почему если в данном случае ввести строку "a b c d" тело выполнится 4 раза, и я получу на выходе
a
b
c
d
Спасибо.
Все очень просто. Первое считывание std::cin>>buf считывает символ 'a'. То есть считывает до разделяющего пробела. Затем выполняется предложение цикла std::cout<<buf<<std::endl;, которое печатает этот символ и символ конца строки, задаваемый с помощью std::endl;
Затем итерация цикла продолжается, и считывается символ 'b', с которым происходят такие же действия. И т.д.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
02.09.2011, 21:15     std::cin #4
.........
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.09.2011, 21:23     std::cin #5
C++
1
while (std::cin>>buf)
Тут на самом деле будет вызван operator void*(std::istream const&) (сигнатура примерная), а тип void* в свою очередь будет приведен к bool для проверки условия цикла. Значение true/false будет зависить от состояния потока (т.е. от флагов eofbit, failbit, badbit и goodbit), при любом выставленном флаге, отличном от goodbit, будет возвращенно false, в противном случае true.

А тут:
C++
1
std::cout<<(std::cin>>buf)
будет вызван std::istream& operator>>(std::istream&, char*), т.е. оператор вернет ссылку на поток ввода, который ты пробуешь вывести в поток вывода, отсюда и бред в output (странно, что это вообще компилируется).
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
02.09.2011, 21:27  [ТС]     std::cin #6
Kastaneda,
Спасибо, где про это можно почитать подробней?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.09.2011, 21:29     std::cin #7
Цитата Сообщение от AlexH Посмотреть сообщение
Спасибо! а как быть со значением выражения, стоящего внутри while, какие значения оно принимает в этом случае?
Я же выше написал)
Если считывание из потока прошло успешно, то будет выставлен флаг goodbit, и выражение примет значение true. А если при считывании возникли "проблемы" (достигнут конец фала (или символа '\n' в случае с std::cin), неверное значение в потоке и т.д.), то будет выставленн соответствующий флаг, и выражение примет значение false, в этом случае цикл while() перестанет выполнятся.
AlexH
0 / 0 / 0
Регистрация: 02.09.2011
Сообщений: 4
02.09.2011, 21:31  [ТС]     std::cin #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я же выше написал)
Если считывание из потока прошло успешно, то будет выставлен флаг goodbit, и выражение примет значение true. А если при считывании возникли "проблемы" (достигнут конец фала (или символа '\n' в случае с std::cin), неверное значение в потоке и т.д.), то будет выставленн соответствующий флаг, и выражение примет значение false, в этом случае цикл while() перестанет выполнятся.
Не успел обновить, сорри.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.09.2011, 21:31     std::cin #9
Цитата Сообщение от AlexH Посмотреть сообщение
Спасибо, где про это можно почитать подробней?
Ну очевидно в любой вменяемой книге по С++ (точно знаю, что про написанно в книге "Философия С++")
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.09.2011, 09:37     std::cin #10
Цитата Сообщение от Kastaneda Посмотреть сообщение
будет вызван std::istream& operator>>(std::istream&, char*), т.е. оператор вернет ссылку на поток ввода, который ты пробуешь вывести в поток вывода, отсюда и бред в output (странно, что это вообще компилируется).
А что странного? Возвращается ссылка на поток, поток неявно преобразуется в void*, в итоге этот void* и выводится на экран. Будет выводиться любое ненулевое значение, если считывание прошло успешно, и 0 в обратном случае.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
03.09.2011, 19:56     std::cin #11
Цитата Сообщение от AlexH Посмотреть сообщение
const int MAX = 256; int main() { char buf[MAX]; std::cout<<(std::cin>>buf); return 0; }
маленкое замечание на будущее
const int MAX = 255;
char buf[MAX];
я так понял что 256 это количество букв(типа максимальное)а максимальное полюбасу 255 байт с нулевым смещением buf[0]указывает на колвол букв
TheAthlete
 Аватар для TheAthlete
151 / 151 / 12
Регистрация: 31.08.2010
Сообщений: 529
04.09.2011, 17:32     std::cin #12
в данном случае лучше использовать std::string вместо char, он имеет больше возможностей и нет проблем с выделением памяти, буферов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
 
using std::cout;
using std::cin;
using std::endl;
using std::string;
 
int main() {
string word;
 
while (cout << "Enter word: ", cin >> word) {
cout << word << endl;
}
return 0;
}
Здесь нужно ввести слово и оно сразу будет выводится на экран. В реальной программе можно сохранять данные или сразу обрабатывать.

Как известно, цикл while работает, пока условие истинно. В нашем случае условие будет истинным, пока не встретится конец файла (Ctrl-Z), либо если значение не соответствует типу.
Для выхода из программы нужно нажать Ctrl-Z

В цикле while в данном примере еще участвует оператор ',' (запятая), результатом которого является правый операнд, т.е. в нашем случае выражение cin >> word

Что касается книг, то наиболее полное руководство по операторам ввода/вывода языка C++ можно найти в книге "Николай Джосьютис. С++ Стандартная библиотека. Для профессионалов" в главе 13 "Ввод-вывод с использованием потоковых классов"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 17:39     std::cin
Еще ссылки по теме:

std::cin Debug Access failed C++
Std:cin ввод нескольких значений C++
Std::cin, символ новой строки C++

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

Или воспользуйтесь поиском по форуму:
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
04.09.2011, 17:39     std::cin #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Все очень просто. Первое считывание std::cin>>buf считывает символ 'a'. То есть считывает до разделяющего пробела...
Если быть точнее, то сначала из входного потока пропускаются все подряд идущие символы из множества {' ', '\n', '\t'} до первого символа, не принадлежащего этому множеству, и этот символ (вернее, его код) будет записан в переменную buf
Yandex
Объявления
04.09.2011, 17:39     std::cin
Ответ Создать тему
Опции темы

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