Как прочитать многострочный ввод из командной строки в C или C ++? - PullRequest
2 голосов
/ 18 июня 2010

Например: Если мне нужно прочитать многострочный ввод, например (а я не знаю, сколько там будет строк!):

1 20

2 31

3 41

Я использую что-то вроде

int main()
{
  string line;

  while(getline(cin,line) != NULL)
  {
       // some code
       // some code    
  }


}

Теперь программа никогда не останавливается, то есть всегда ожидает некоторого ввода. Как я клюваю петлю, когда больше нет входных линий?

Ответы [ 5 ]

4 голосов
/ 19 июня 2010

Просто проверяйте пустую переменную line каждый раз, когда вы читаете строку. Если используемые прессы вводятся без других данных, то line будет пустым.

#include <iostream>
#include <string>

using std::cin;
using std::getline;
using std::string;

int main(int argc, char *argv[]) {

    string line;

    while (true) {
        getline(cin, line);
        if (line.empty()) {
            break;
        }
        // some code
    }
    return 0;
}
2 голосов
/ 18 июня 2010

Обратите внимание, что использование scanf непосредственно на stdin не очень безопасно.Например, ввод чего-либо, что не может быть проанализировано как число, приведет к зависанию цикла.Вот более надежная реализация, которая сначала читает целые строки, а затем пытается извлечь из нее числа.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
        char * line = NULL;
        size_t sz = 0;

        while(!feof(stdin)) {
                ssize_t ln = getline(& line, & sz, stdin);

                if(ln > 0) {
                        int x, y;

                        if(sscanf(line, "%d %d", & x, & y) == 2)
                                printf("x = %i, y = %i\n", x, y);
                        else
                                puts("invalid input");
                }
        }

        return EXIT_SUCCESS;
}
1 голос
/ 19 июня 2010

В Linux - Cd (или Ctrl + D) выводит символ EOF, который завершит ваш цикл.

Гораздо проще сделать что-то вроде ...

~ $ cat sample.input | my_cool_program
output will be displayed here.
0 голосов
/ 19 июня 2010

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

0 голосов
/ 18 июня 2010
while (true)
   {
   long value1;
   long value2;
   int nofValuesRead;
   nofValuesRead = scanf("%ld %ld\n",&value1,&value2);
   if (nofValuesRead==0) break;
   if (nofValuesRead>=1)
      {
      // Process value1
      }
   if (nofValuesRead>=2)
      {
      // Process value2
      }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...