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

#c #stream

#c #поток

Вопрос:

В задаче, которую мне дали попробовать в книге по C , мне сказали создать функцию, которая принимала бы входной поток в качестве аргумента со значениями, являющимися int, хранящимися в последовательности в потоке.

Теперь я бы получил объявление, которое было бы чем-то вроде:

 foo(istream amp;arg);
  

Но, похоже, я не могу понять, как я мог бы получить значения внутри входного потока и сохранить их в другой переменной. Может ли кто-нибудь помочь мне и привести простой пример, который я мог бы понять?

Спасибо.

Комментарии:

1. istream >> оператор может быть хорошей отправной точкой.

Ответ №1:

Непонятно, чего вы не понимаете. Для чтения одного значения вы используете >> оператор в потоке. Чтобы прочитать более одного значения, вы используете >> более одного раза; если вы хотите прочитать весь поток, вы выполняете цикл до тех пор, пока ввод не завершится ошибкой. Для сохранения значений вы используете std::vector<int> , используя push_back для вставки каждого значения.

Конечно, опытный программист на C с большей вероятностью будет использовать std::istream_iterator<int> для прямой инициализации вектора:

 std::vector<int>
foo( std::istreamamp; inputStream )
{
    return std::vector<int>
        (std::istream_iterator<int>( inputStream )),
        (std::istream_iterator<int>()) );
}
  

Однако цель проблемы, по-видимому, заключается в том, чтобы научиться писать
цикл, поэтому для целей обучения вам, вероятно, следует написать свой собственный цикл.

Ответ №2:

Потоки используют операторы stream, например:

 std::cout << "enter an integer number: ";
  

и

 int x;
std::cin >> x;
  

Поскольку это похоже на домашнее задание, я остановлюсь на этой подсказке.

Как вы могли бы догадаться, std::cin это пример istream (входного потока) и std::cout является ostream (выходным потоком)

Комментарии:

1. Видите, эта часть проблемы не доставляет мне хлопот. Мой вопрос в том, как только я получаю поток, на который ссылается поток, имеющий несколько значений, как я могу использовать каждое из них по отдельности. Я знаю, что мог бы выполнить arg >> x >> y >> z, но я хочу сделать что-то вроде arg >> x и просто продолжать захватывать значения из arg в x и выполнять цикл, когда в потоке аргументов ничего не останется.

2. while (std::cin >> x) { /*do stuff?*/ } (для справки, в вашем вопросе действительно говорилось «как я получу значения внутри входного потока»?!)

Ответ №3:

Вы хотите сохранить значения, указанные в вашем istream , или просто выбросить их (например, дождаться, пока пользователь нажмет клавишу ENTER, прежде чем перейти к другой части программы)?

Вам может понадобиться std::getline, который будет считывать все до следующей новой строки и сохранять весь фрагмент в виде строки, которую вы можете разобрать (или отбросить).

Как уже упоминалось, >> будет считываться другое значение (обычно разделенное пробелами) одно за другим, так что вы можете сохранить первый ввод в переменную x , второй в y , третий в z и т.д. (Если вы хотите по-настоящему фантазировать, вы даже можете поместить их в vector , list deque или любой другой тип контейнера по вашему выбору.)