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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
#1

Cin, чтение с конца полученного потока - C++

05.11.2013, 15:03. Просмотров 1443. Ответов 18
Метки нет (Все метки)

Происходит ввод с клавиатуры последовательности чисел разделенных пробелами, нужно извлечь из этого потока последнее значение. Как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2013, 15:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Cin, чтение с конца полученного потока (C++):

Возобновление потока cin. - C++
Всем привет =) С недавних пор изучаю С++, и вот однажды, во время выполнения одного из заданий из учебника Страуструпа, наткнулся я на...

Обработка ошибок ввода из потока cin - C++
Доброго времени суток всем! Помогите пожалуйста разобраться. После ввода буквы например, то есть когда поток ломается, пытаюсь его...

Детали относительно входного потока cin - C++
Здравствуйте) у меня тут такая проблемка: есть вот такой вот участок кода(в основной программе): //... cout << "\t" <<...

std::cin, eof не всегда принимается как признак конца файла - C++
std::string text; char ch = 0; while(!std::cin.get(ch).eof()){ text.append(1, ch); } Ввожу в консоль в Windows: "^Z"...

Как проверить на пустоту буфер потока cin ? - C++
Мне нужно ввести строку такого типа: "поиск 1 2 3" cin>>sts.code; j = 0; while( ???вот тут что то !буфер.empty()) { ...

Использование потока cin для ввода символов - C++
Вот первая функция, cin.get(ch) которую я не понимаю int main() { char ch; cin.get(ch); while (ch != '\n') { cout <<...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
reidaigo
6 / 6 / 0
Регистрация: 16.12.2012
Сообщений: 31
05.11.2013, 15:20 #2
Последовательность чисел определить как динамический массив символов. Определить длину массива функцией strlen(). Последним значением будет элемент с индексом strlen()-1/
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
05.11.2013, 15:28 #3
Самое простое, - считать числа в массив и вывести его наоборот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
 
int main()
{
   std::cout << "Enter numbers (any letters to stop):\n-> ";
   std::vector<int> numbers( (std::istream_iterator<int>(std::cin)), std::istream_iterator<int>() );
   std::reverse_copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));
 
   std::cout << "\nDone." << std::endl;
   return 0;
}
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
05.11.2013, 16:17  [ТС] #4
reidaigo, не то, надо проще. Чтобы без массивов. Ведь все введенные с клавиатуры значения до их чтения из потока хранятся в нем. При обычно чтении, они извлекаются из потока в порядке ввода, а мне нужно извлекать их в обратном порядке(т.е. начиная с последнего и заканчивая первым). Как это реализовать?
DiffEreD Ввод должен производиться 1 раз! Числа разделенные пробелом. И да без массивов.

Добавлено через 43 минуты
C++
1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int main(){
int a;
cin >> a;
return 0;
}
По примеру кода выше:
"cin >> a;" - происходит ввод последовательности чисел, допустим "4 15 67 10". Соответственно значение a это будет 4. А оставшиеся числа 15, 67, 10 останутся во входном потоке. Если, к примеру, мы сейчас снова пропишем "cin >> a;" то компьютер не предоставит пользователю возможность ввода(у него уже есть значения в потоке), то есть a станет равно 15. Вот здесь что мне нужно, если по моему примеру, нужно из тех чисел, что остались в потоке, переменной a присвоить последнее, то есть не 15(или даже 4), а 10. А все остальные значения кроме 10 должны так и остаться в потоке! Кто-нибудь подскажет??
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.11.2013, 16:43 #5
Fareor,
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    int n;
    cin>>n;
    while (cin.peek() != '\n') {
        cin.get();
        cin>>n;
    }
    cout<<n;
    system("pause");
    return 0;
}
Пардон, не увидел, что вам нужно, чтобы всё остальное сохранялось в потоке)
Matan!
270 / 121 / 24
Регистрация: 31.05.2013
Сообщений: 1,081
Записей в блоге: 2
Завершенные тесты: 1
05.11.2013, 16:44 #6
Так и напиши,обратить массив.Вот,пожалуйста
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
#include <iostream>
#include <stdio.h>
#include <string>
 
using namespace std;
 
int main()
{
    int N;
    double mass[10000], NumbWhile;
    setlocale(0,"");
 
    while (true)
    {
        cout << "Нажмите 1 для продолжения работы" << endl;
        cin >> NumbWhile;
        if (NumbWhile==1)
        {
            cout << "Введите размер массива" << endl;
            cin >> N;
            if (N<0)
            {
                cout << "Неправильно введённые данные" << endl;
                system("pause");
                return 1;
            }
 
            cout << "Введите массив" << endl;
            for(int i=0; i<N; i++)
                cin >> mass[i];
 
            cout << "Массив в обратном порядке: " << endl; 
            for(int i=N; i>0; i--)
            {
                swap(mass[i-1],mass[i]);
                cout << mass[i] << "  ";
            }
            cout << endl;
        }
        else break;
    }
    system("pause");
    return 0;
}
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
05.11.2013, 17:02  [ТС] #7
Matan!, Я несколько раз писал, что нужна реализация без использования массивов..

Добавлено через 4 минуты
scenotaph, Да, сейчас подскажите?

Вообще, если "cin >> a;" берет первое значение из потока, должна же быть функция, которая берет последнее. или нет?
scenotaph
120 / 120 / 15
Регистрация: 29.03.2013
Сообщений: 237
05.11.2013, 17:14 #8
Fareor, Ни разу с подобным не сталкивался. Не используя массивы, ничего на ум не приходит
Matan!
270 / 121 / 24
Регистрация: 31.05.2013
Сообщений: 1,081
Записей в блоге: 2
Завершенные тесты: 1
06.11.2013, 08:46 #9
Цитата Сообщение от Fareor Посмотреть сообщение
Вообще, если "cin >> a;" берет первое значение из потока, должна же быть функция, которая берет последнее. или нет?
Тебе товарищ scenotaph ответил,как вывести последнее значение без массива.
Но опять-таки.Ты просишь:"Приготовьте мне бутерброд с маслом без масла".
Если просишь,чтобы программа выводила последовательность,то массив обязательно должен быть, поскольку все введённые значения надо где-то хранить.Можно,конечно,извратиться до перечисления(enum) или структуры.Но тут такой гибкости,как с массивами,не будет.

Добавлено через 15 минут
Цитата Сообщение от Fareor Посмотреть сообщение
"cin >> a;" берет первое значение из потока
Кто тебе сказал эту глупость?Это просто ввод значения а и не более того.В каком смысле"берёт"?
CIN=C(из С)+IN(ввод).
Fareor
0 / 0 / 0
Регистрация: 18.11.2012
Сообщений: 5
06.11.2013, 09:12  [ТС] #10
Matan!, Зачем значения записывать в массив если они и так хранятся во входном потоке?(массив это как-бы лишнее..)? Ранее я это описал.. Просто вывести последнее значение это не то, что мне нужно!
Цитата Сообщение от Fareor Посмотреть сообщение
нужно извлечь из этого потока последнее значение
- то есть значение должно быть получено именно именно из потока, при этом все остальные значения должны так и остаться в потоке(кажется я много раз уже пытался это описать!)

Добавлено через 3 минуты
Цитата Сообщение от Matan! Посмотреть сообщение
Кто тебе сказал эту глупость?Это просто ввод значения а и не более того.В каком смысле"берёт"?
CIN=C(из С)+IN(ввод).
Проверь сам Так и происходит, остальные символы остаются в потоке. Это не просто ввод, если в потоке уже что-то есть, никакого ввода не будет(пользователю не предоставится возможность ввода), компьютер возьмет значение из имеющихся в потоке!

Добавлено через 3 минуты
Я ведь уже описывал как все происходит:
Цитата Сообщение от Fareor Посмотреть сообщение
По примеру кода выше:
"cin >> a;" - происходит ввод последовательности чисел, допустим "4 15 67 10". Соответственно значение a это будет 4. А оставшиеся числа 15, 67, 10 останутся во входном потоке. Если, к примеру, мы сейчас снова пропишем "cin >> a;" то компьютер не предоставит пользователю возможность ввода(у него уже есть значения в потоке), то есть a станет равно 15. Вот здесь что мне нужно, если по моему примеру, нужно из тех чисел, что остались в потоке, переменной a присвоить последнее, то есть не 15(или даже 4), а 10. А все остальные значения кроме 10 должны так и остаться в потоке!
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
06.11.2013, 10:18 #11
Fareor, Довольно странное задание, так просто это не сделать. Поток нельзя читать с конца, только с начала, что логично как бэ. Только если играться с буфером потока непосредственно.
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,503
Завершенные тесты: 1
06.11.2013, 10:42 #12
Цитата Сообщение от ForEveR Посмотреть сообщение
что логично как бэ
Потому что он FIFO?
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
06.11.2013, 10:53 #13
Рекурсия должна спасти отца русской демократии. Рекурсия, рекурсия и ещё раз рекурсия ... В.И. Ленин
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
06.11.2013, 11:34 #14
Рекурсия должна по идее. Криво, но как-то так

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
#include <iostream>
#include <limits>
 
void putback_number(int value)
{
   while (value)
   {
      std::cin.putback(static_cast<int>(value % 10) + '0');
      value /= 10;
   }
}
 
void read_last_impl(int& value)
{
   static bool initialized = false;
   int a = std::numeric_limits<int>::max();
   std::cin >> a;
   if (!std::cin.fail())
   {
      read_last_impl(value);
   }
   if (!initialized && a != std::numeric_limits<int>::max())
   {
      value = a;
      initialized = true;
      return;
   }
   if (a != std::numeric_limits<int>::max())
   {
      std::cin.putback(' ');
      putback_number(a);
   }
   else
   {
      std::cin.clear();
   }
}
 
int read_last()
{
   int value = 0;
   read_last_impl(value);
   return value;
}
 
int main()
{
   std::cout << read_last() << std::endl;
   // only check that values are in stream
   /*std::string v;
   std::getline(std::cin, v);
   std::cout << v << std::endl;*/
}
chedman
81 / 80 / 2
Регистрация: 30.10.2013
Сообщений: 251
06.11.2013, 12:06 #15
Известно, что рекурсию можно заменить итерацией. Ну, ладно, а это подойдет
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
using namespace std;
 
int main()
{
    int a;
    char c;
 
    do
    {
        cin >> a;
        c= cin.get() ;
    }
    while( c!=10);
    
    cout << a;
    return 0;
}
Добавлено через 17 минут
можно действительно обнаружить конец потока (нажатие Ctrl+D или Ctrl+Z - от ОС зависит) если заменить 10 на -1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.11.2013, 12:06
Привет! Вот еще темы с ответами:

Работа с cin при считывании с потока ввода - C++
есть кусочек кода while (1) { string buf = name; cout &lt;&lt; &quot;Message : &quot;; string symbolBuf = &quot;&quot;; while (cin &gt;&gt;...

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync - C++
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита от дурака&quot; на ввод. Не пойму предназначение cin.get() !=...

Ошибка при повторном получении данных из потока cin - C++
Добрый день, уважаемые форумчане. Делал учебную задачу и столкнулся с проблемой, которую затрудняюсь сам решить. Задача...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear() - C++
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не изучал, поэтому возникали некоторые проблемы....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.11.2013, 12:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru