powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема считывания информации из входного потока (cin)
26 сообщений из 26, показаны все 2 страниц
Проблема считывания информации из входного потока (cin)
    #38255800
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Код: 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
Проблема считывания информации из входного потока (cin)
    #38255815
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumПодозреваю, что в следующей строке кода:
Код: plaintext
1.
while(cin >> n){

Если возникли подозрения, надо прочитать документацию.
istream >> возвращает указатель на поток а вовсе не булево значение "успешно/не успешно".
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38255827
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли возникли подозрения, надо прочитать документацию.
istream >> возвращает указатель на поток а вовсе не булево значение "успешно/не успешно".
Я делаю по аналогии тому, как пишет в своих примерах Страуструп, а он проверяет именно так.
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38255909
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumWhite OwlЕсли возникли подозрения, надо прочитать документацию.
istream >> возвращает указатель на поток а вовсе не булево значение "успешно/не успешно".
Я делаю по аналогии тому, как пишет в своих примерах Страуструп, а он проверяет именно так.Правда? Где?
.... [через пять минут]
Хм... действительно, есть у него такие примеры. http://www.lib.ru/CPPHB/cpptut.txt В главе 8.8.
Видать писалось это еще до реального создания istream класса.
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38255918
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблема считывания информации из входного потока (cin)
    #38255921
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблема считывания информации из входного потока (cin)
    #38255922
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlХм... действительно, есть у него такие примеры. http://www.lib.ru/CPPHB/cpptut.txt В главе 8.8.
Видать писалось это еще до реального создания istream класса.
Думаю тут кое-кому следует тоже почитать доку, прежде чем :)

Во-первых, оператор >> (как и <<) возвращает не указатель, а ссылку на поток.
Во-вторых, ссылка на поток в булевом контексте (if, while, etc) неявно преобразуется в булево значение, показывающее успешно ли выполнена последняя операция над потоком.
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38255929
Если массив небольшой и из середины не удаляют, то лучше вектор, чем лист:
Код: 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
Проблема считывания информации из входного потока (cin)
    #38255939
лучше вектор,

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

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

Неее... лучше Не вектор, а valarray
и чем же он лучше? Он может просуммировать все элементы:
http://msdn.microsoft.com/en-us/library/787325a0(v=vs.80).aspx
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38255967
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
Проблема считывания информации из входного потока (cin)
    #38255974
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблема считывания информации из входного потока (cin)
    #38255977
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКак сочетается - не знаю, поскольку не вижу как это вообще связано.
Ну если не видишь, тогда предскажи поведение вот такого кода:
if(cin >> a >> b)
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38255979
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНу если не видишь, тогда предскажи поведение вот такого кода:
if(cin >> a >> b)
if сработает если и a и b успешно считались.
Причем здесь функции возвращающие разные типы я все равно не понял.
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38255983
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlНу если не видишь, тогда предскажи поведение вот такого кода:
if(cin >> a >> b)
if сработает если и a и b успешно считались.А если не успешно? Если обломались на а, то что? А если на b то что?

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

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

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

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

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


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


происходит очередная попытка прочитать его. Поэтому я создал дополнительную переменную, в которую и считываю лишний символ.
...
Рейтинг: 0 / 0
Проблема считывания информации из входного потока (cin)
    #38256666
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Проблема считывания информации из входного потока (cin)
    #38256687
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
Проблема считывания информации из входного потока (cin)
    #38256704
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая версия компилятора?Чето там под древние компиляторы.

Автор, у тебя какая версия компилятора?
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.51106.1 for x64
и
gcc 4.7 (второй - по памяти, т.к. он дома, могу ошибаться).

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


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