С++ cin читать STDIN

Как использовать C++, чтобы получить все STDIN и проанализировать их?

Например, мой ввод

2
1 4
3
5 6 7

Я хочу использовать С++ для чтения STDIN с помощью cin и сохранения каждой строки в массиве. Итак, это будет вектор/массив массива целых чисел.

Спасибо!


person JJ Liu    schedule 25.12.2011    source источник
comment
так в чем ваш вопрос или проблема здесь? вы должны делать свою домашнюю работу в одиночку или быть более конкретным.   -  person Baarn    schedule 25.12.2011
comment
Вероятно, это первое, чему учит любая книга по C++.   -  person Seth Carnegie    schedule 25.12.2011


Ответы (3)


Поскольку это не помечено как домашнее задание, вот небольшой пример чтения из stdin с использованием std::vector и std::stringstream. В конце я добавил дополнительную часть также для перебора vector и вывода значений. Дайте консоли EOF (ctrl + d для *nix, ctrl + z для Windows), чтобы остановить ее. от чтения на входе.

#include <iostream>
#include <vector>
#include <sstream>

int main(void)
{
   std::vector< std::vector<int> > vecLines;

   // read in every line of stdin   
   std::string line;
   while ( getline(std::cin, line) )
   {
      int num;
      std::vector<int> ints;
      std::istringstream ss(line); // create a stringstream from the string

      // extract all the numbers from that line
      while (ss >> num)
         ints.push_back(num);

      // add the vector of ints to the vector of vectors         
      vecLines.push_back(ints);      
   }

   std::cout << "\nValues:" << std::endl;
   // print the vectors - iterate through the vector of vectors   
   for ( std::vector< std::vector<int> >::iterator it_vecs = vecLines.begin();
         it_vecs != vecLines.end(); ++it_vecs )
   {
      // iterate through the vector of ints and print the ints
      for ( std::vector<int>::iterator it_ints = (*it_vecs).begin();
         it_ints < (*it_vecs).end(); ++it_ints )
      {
         std::cout << *it_ints << " ";
      }

      std::cout << std::endl; // new line after each vector has been printed
   }

   return 0;
}

Ввод, вывод:

2
1 4
3
5 6 7

Values:
2 
1 4 
3 
5 6 7 

EDIT: добавлено еще несколько комментариев к коду. Также обратите внимание, что пустые vectors из ints могут быть добавлены к vecLines (из пустой строки ввода), это сделано намеренно, чтобы вывод был таким же, как ввод.

person AusCBloke    schedule 25.12.2011

int main () 
{
    char line[100];
    while(!cin.eof()){
        cin.getline(line, 100);
        printf("%s\n", line);
    }

    return 0;
}

Извините, я просто не был уверен, есть ли способ лучше этого.

person JJ Liu    schedule 25.12.2011
comment
Есть лучшие способы С++. Прочитайте его в строку вместо массива символов. Используйте строковый поток, чтобы проанализировать его в ваш целочисленный вектор. - person Duck; 25.12.2011

Это должно соответствовать вашим требованиям, используйте istringstream для разделения строки на массив.

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
using namespace std;

int main()
{
        string s("A B C D E F G");
        vector<string> vec;
        istringstream iss(s);

        do
        {
                string sub;
                iss >> sub;
                if ( ! sub.empty() ) 
                        vec.push_back (sub);
        } while (iss);

        vector<string>::iterator it = vec.begin();
        while ( it != vec.end() )
        {
                cout << *it << endl;
                it ++;
        }

        return 0;
}
person daisy    schedule 25.12.2011