Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема считывания информации из входного потока (cin) / 25 сообщений из 26, страница 1 из 2
13.05.2013, 21:13
    #38255800
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
Доброго времени суток.
Код: plaintext
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.
#include "../../std_lib_facilities.h"
int main(){
	try{
		vector<int>items;
		const string prompt1("Пожалуйста, введите несколько чисел (для прекращения ввода " 
			"нажмите клавишу <|>:\n");		
		cout << prompt1;
		int n = 0;
		while(cin >> n) items.push_back(n);
		if(!items.size()){
			cout << "Данные для обработки не были введены." << endl;
			return 0;
		}
		const string prompt2("Пожалуйста, укажите количество чисел, которые хотите " 
                      "просуммировать: ");
		cout << prompt2;
		while(cin >> n){
			if (n <= 0 || n > items.size()){
				cout << "Количество должно быть в интервале от 1 до " << items.size() << '.' 
					<< endl;
				cout << prompt2;
				continue;
			}
			int sum = 0;
			cout << endl << "Сумма первых " << n << " чисел: ";
			for(int i = 0; i < n; ++i){
				cout << items << (i != n - 1) ? ", " : "";
				sum += items[i];
			}
			cout << " равна " << sum << "." << endl << endl;
			cout << prompt2;
		}
	}
	catch(exception& e){
		cout << e.what() << endl;
		return 1;
	}
	catch(...){
		cout << "Неизвестное исключение." << endl;
		return 2;
	}
	return 0;
}


В приведённом выше коде, после запроса [i]"Пожалуйста, укажите количество чисел, которые хотите просуммировать: "
, программа сразу же завершает свою работу. Подозреваю, что в следующей строке кода:
Код: plaintext
1.
while(cin >> n){


переменной n из потока повторно считывается символ "|", с помощью которого перед этим был завершён ввод исходных данных (возможно ошибаюсь). Как в C++ правильно обойти эту проблему?

Спасибо.
...
Рейтинг: 0 / 0
13.05.2013, 21:35
    #38255815
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
CompositumПодозреваю, что в следующей строке кода:
Код: plaintext
1.
while(cin >> n){

Если возникли подозрения, надо прочитать документацию.
istream >> возвращает указатель на поток а вовсе не булево значение "успешно/не успешно".
...
Рейтинг: 0 / 0
13.05.2013, 21:51
    #38255827
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White OwlЕсли возникли подозрения, надо прочитать документацию.
istream >> возвращает указатель на поток а вовсе не булево значение "успешно/не успешно".
Я делаю по аналогии тому, как пишет в своих примерах Страуструп, а он проверяет именно так.
...
Рейтинг: 0 / 0
13.05.2013, 23:32
    #38255909
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
CompositumWhite OwlЕсли возникли подозрения, надо прочитать документацию.
istream >> возвращает указатель на поток а вовсе не булево значение "успешно/не успешно".
Я делаю по аналогии тому, как пишет в своих примерах Страуструп, а он проверяет именно так.Правда? Где?
.... [через пять минут]
Хм... действительно, есть у него такие примеры. http://www.lib.ru/CPPHB/cpptut.txt В главе 8.8.
Видать писалось это еще до реального создания istream класса.
...
Рейтинг: 0 / 0
13.05.2013, 23:55
    #38255918
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
Compositum,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>
#include <list>
using namespace std;

int main() {
	int n = 0;
	cout << "N = ";
	cin >> n;// Получаем N (кол-во чисел)
	list<int> items;
	for (int i = 1, tmp; i <= n; i++) { // N-раз считываем
		cout << "#" << i << " = ";
		cin >> tmp;
		items.push_back(tmp);
	}

	cout << "Output:" << endl;
	for (list<int>::const_iterator it = items.begin(); it != items.end(); it++) {
		cout << *it << ";";
	}
	cout << endl;
	return 0;
}
...
Рейтинг: 0 / 0
13.05.2013, 23:59
    #38255921
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White OwlПравда? Где?
.... [через пять минут]
Хм... действительно, есть у него такие примеры. http://www.lib.ru/CPPHB/cpptut.txt В главе 8.8.
Видать писалось это еще до реального создания istream класса.

Книга "Программирование. Принципы и практика использования C++. Исправленное издание". На стр. 150 Страуструп рекомендует использовать этот подход и поясняет что к чему.

White OwlВидать писалось это еще до реального создания istream класса.
Это вряд ли.

Вопрос решён. В обозначенной книге на указанной мною странице была ссылка на главу 10.6 (пока не дочитал до неё), где и нашёл ответ. Рабочий вариант такой:
Код: plaintext
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.
#include "../../std_lib_facilities.h"
int main(){
	try{
		vector<int>items;
		const string prompt1("Пожалуйста, введите несколько чисел (для прекращения ввода " 
			"нажмите клавишу <|>:\n");		
		cout << prompt1;
		int n = 0;
		while(cin >> n) items.push_back(n);
		if(!items.size()){
			cout << "Данные для обработки не были введены." << endl;
			return 0;
		}
		const string prompt2("Пожалуйста, укажите количество чисел, которые хотите " 			"просуммировать: ");
		cout << prompt2;
		cin.clear();
		char c = ' ';
		cin >> c;
		while(cin >> n){
			if (n <= 0 || n > items.size()){
				cout << "Количество должно быть в интервале от 1 до " << items.size() << '.' 
					<< endl;
				cout << prompt2;
				continue;
			}
			int sum = 0;
			cout << endl << "Сумма первых " << n << " чисел: ";
			for(int i = 0; i < n; ++i){
				cout << items[i] << ((i != n - 1) ? ", " : "");
				sum += items[i];
			}
			cout << " равна " << sum << "." << endl << endl;
			cout << prompt2;
		}
	}
	catch(exception& e){
		cout << e.what() << endl;
		return 1;
	}
	catch(...){
		cout << "Неизвестное исключение." << endl;
		return 2;
	}
	return 0;
}
...
Рейтинг: 0 / 0
13.05.2013, 23:59
    #38255922
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White OwlХм... действительно, есть у него такие примеры. http://www.lib.ru/CPPHB/cpptut.txt В главе 8.8.
Видать писалось это еще до реального создания istream класса.
Думаю тут кое-кому следует тоже почитать доку, прежде чем :)

Во-первых, оператор >> (как и <<) возвращает не указатель, а ссылку на поток.
Во-вторых, ссылка на поток в булевом контексте (if, while, etc) неявно преобразуется в булево значение, показывающее успешно ли выполнена последняя операция над потоком.
...
Рейтинг: 0 / 0
14.05.2013, 00:14
    #38255929
Проблема считывания информации из входного потока (cin)
Если массив небольшой и из середины не удаляют, то лучше вектор, чем лист:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n = 0;
	cout << "N = ";
	cin >> n;// Получаем N (кол-во чисел)
	vector<int> items(n);
	for (auto &i : items) { // N-раз считываем
		cout << ", ";
        	cin >> i;
	}

	cout << endl << "Output:" << endl;
	for (auto &i : items) {
		cout << i << ";";
	}
	cout << endl;
	return 0;
}
...
Рейтинг: 0 / 0
14.05.2013, 00:31
    #38255939
Проблема считывания информации из входного потока (cin)
лучше вектор,

Неее... лучше Не вектор, а valarray
...
Рейтинг: 0 / 0
14.05.2013, 00:38
    #38255946
Проблема считывания информации из входного потока (cin)
лучше НЕ векторлучше вектор,

Неее... лучше Не вектор, а valarray
и чем же он лучше?
...
Рейтинг: 0 / 0
14.05.2013, 00:39
    #38255947
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
Anatoly MoskovskyВо-первых, оператор >> (как и <<) возвращает не указатель, а ссылку на поток.Ну да ссылку, оговорился, виноват.[/quot]
Anatoly MoskovskyВо-вторых, ссылка на поток в булевом контексте (if, while, etc) неявно преобразуется в булево значение, показывающее успешно ли выполнена последняя операция над потоком.ээээ.... А это где сказано?
И как это сочетается с запретом на возврат значений разных типов из функций с одинаковыми параметрами?
...
Рейтинг: 0 / 0
14.05.2013, 00:59
    #38255957
valarray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
и чем же он лучше?лучше НЕ векторлучше вектор,

Неее... лучше Не вектор, а valarray
и чем же он лучше? Он может просуммировать все элементы:
http://msdn.microsoft.com/en-us/library/787325a0(v=vs.80).aspx
...
Рейтинг: 0 / 0
14.05.2013, 01:13
    #38255967
Проблема считывания информации из входного потока (cin)
valarrayи чем же он лучше?пропущено...

и чем же он лучше? Он может просуммировать все элементы:
http://msdn.microsoft.com/en-us/library/787325a0(v=vs.80).aspx
В данном случае да:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <iostream>
#include <valarray>
using namespace std;

int main() {
    int n = 0;
    cout << "N = ";
	cin >> n;// Получаем N (кол-во чисел)
	valarray<int> items(n);
	for (auto &i : items) { // N-раз считываем
		cout << ", ";
        	cin >> i;
	}

	cout << endl << "Output:" << endl;
	for (auto &i : items) {
		cout << i << ";";
	}
    
    cout << endl << "sum = " << items.sum() << endl;
	return 0;
}
...
Рейтинг: 0 / 0
14.05.2013, 01:45
    #38255974
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White OwlAnatoly MoskovskyВо-вторых, ссылка на поток в булевом контексте (if, while, etc) неявно преобразуется в булево значение, показывающее успешно ли выполнена последняя операция над потоком.ээээ.... А это где сказано?
И как это сочетается с запретом на возврат значений разных типов из функций с одинаковыми параметрами?
Формально сказано в стандарте:
C++0327.4.4.3 basic_ios iostate flags functions
[lib.iostate.flags]
operator void*() const;
Returns: If fail() then a null pointer; otherwise some non-null pointer to indicate success.

Неформально можно прочесть тут
http://www.parashift.com/c -faq-lite/istream-and-while.html

Как сочетается - не знаю, поскольку не вижу как это вообще связано.
...
Рейтинг: 0 / 0
14.05.2013, 02:16
    #38255977
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
Anatoly MoskovskyКак сочетается - не знаю, поскольку не вижу как это вообще связано.
Ну если не видишь, тогда предскажи поведение вот такого кода:
if(cin >> a >> b)
...
Рейтинг: 0 / 0
14.05.2013, 02:21
    #38255979
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White OwlНу если не видишь, тогда предскажи поведение вот такого кода:
if(cin >> a >> b)
if сработает если и a и b успешно считались.
Причем здесь функции возвращающие разные типы я все равно не понял.
...
Рейтинг: 0 / 0
14.05.2013, 02:32
    #38255983
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
Anatoly MoskovskyWhite OwlНу если не видишь, тогда предскажи поведение вот такого кода:
if(cin >> a >> b)
if сработает если и a и b успешно считались.А если не успешно? Если обломались на а, то что? А если на b то что?

Anatoly MoskovskyПричем здесь функции возвращающие разные типы я все равно не понял.
Чтобы if(cin >> a) работало как предполагается результат cin>>a должен быть либо нулевым, либо не нулевым. А он по определению ссылка на сам cin. То есть нулевым результат быть не может.
...
Рейтинг: 0 / 0
14.05.2013, 02:56
    #38255987
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White OwlЧтобы if(cin >> a) работало как предполагается результат cin>>a должен быть либо нулевым, либо не нулевым. А он по определению ссылка на сам cin. То есть нулевым результат быть не может.
Нет. Чтобы if(cin >> a) работало как предполагается результат cin>>a должен приводится к булевому значению (а не обязательно им являться).
Это обеспечивается оператором преобразования типа operator void*.
Т.е. когда контекст булевый, то поток неявно преобразуется в void*, потому что доступно такое преобразование и потому что указатели в булевом контексте рассматриваются как булевые значения.
Преобразование это производится только для наружного (последнего) оператора >> в выражении, поскольку только он находится в булевом контексте.
...
Рейтинг: 0 / 0
14.05.2013, 03:02
    #38255988
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White Owlif сработает если и a и успешно считались.А если не успешно? Если обломались на а, то что? А если на b то что?
[/quote]
По моему в отквоченном я четко написал что произойдет.
Если а не считано то b тоже не будет считано, т.к. после ошибки все последующие операции дают ошибку тоже, пока состояние ошибки не будет очищено.
Соответственно выражение из двух >> даст true только если оба значения будут считаны без ошибок, но вызов >> произойдет в любом случае дважды.
...
Рейтинг: 0 / 0
14.05.2013, 08:21
    #38256034
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
По поводу того, какой контейнер следовало\не следовало использовать: я просто последовательно выполняю все упражнения в книге. Согласно текущему заданию нужно было использовать именно вектор.
...
Рейтинг: 0 / 0
14.05.2013, 08:32
    #38256038
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
White OwlAnatoly MoskovskyВо-вторых, ссылка на поток в булевом контексте (if, while, etc) неявно преобразуется в булево значение, показывающее успешно ли выполнена последняя операция над потоком.ээээ.... А это где сказано?
И как это сочетается с запретом на возврат значений разных типов из функций с одинаковыми параметрами?
Это сказано в любой книге, обучающей программированию в C/C++. В частности, это сказано в K&R.
...
Рейтинг: 0 / 0
14.05.2013, 11:31
    #38256313
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
Compositum,

Вопрос решён.

Т.е. не было вызова
cin.clear()
после завершения первой серии ввода.
Это я для "потомков" расшифровываю.
...
Рейтинг: 0 / 0
14.05.2013, 12:12
    #38256385
Compositum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
MasterZivCompositum,

Вопрос решён.

Т.е. не было вызова
cin.clear()
после завершения первой серии ввода.
Это я для "потомков" расшифровываю.
Не совсем так. Я добавил не одну, а три строки кода:
Код: plaintext
1.
2.
3.
cin.clear();
char c = ' ';
cin >> c;


Если разместить только первую, то программа по прежнему будет завершаться не входя в цикл while. Подозреваю - это происходит потому, что символ стаётся несчитанным, а после вызова
Код: plaintext
1.
cin.clear();


происходит очередная попытка прочитать его. Поэтому я создал дополнительную переменную, в которую и считываю лишний символ.
...
Рейтинг: 0 / 0
14.05.2013, 14:34
    #38256666
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема считывания информации из входного потока (cin)
Compositum,

Решение проблемы: http://support.microsoft.com/kb/132422
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
const string prompt2("Пожалуйста, укажите количество чисел, которые хотите " 
	"просуммировать: ");
cout << prompt2;
ClearError(cin);
while(cin >> n){
...
...
Рейтинг: 0 / 0
14.05.2013, 14:42
    #38256687
Проблема считывания информации из входного потока (cin)
UsmanCompositum,

Решение проблемы: http://support.microsoft.com/kb/132422
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
const string prompt2("Пожалуйста, укажите количество чисел, которые хотите " 
	"просуммировать: ");
cout << prompt2;
ClearError(cin);
while(cin >> n){
...


Чето там под древние компиляторы.

Автор, у тебя какая версия компилятора?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема считывания информации из входного потока (cin) / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]