#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
или любой другой тип контейнера по вашему выбору.)