входные данные конвейера - PullRequest
       13

входные данные конвейера

1 голос
/ 13 декабря 2010

Мне нужно написать программу, которая работает с вводом из файла или оболочки (для обработки конвейера). Какой самый эффективный способ справиться с этим? По сути, мне нужно читать ввод за строкой, но ввод может быть выводом другой программы из оболочки или файла.

Спасибо

Ответы [ 4 ]

1 голос
/ 13 декабря 2010

Вот пример C из Echo All Palindromes, в C :

int main(int argc, char* argv[]) {
  int exit_code = NO_MATCH;
  if (argc == 1) // no input file; read stdin
    exit_code = palindromes(stdin);
  else {
    // process each input file
    FILE *fp = NULL;
    int ret = 0;
    int i;
    for (i = 1; i < argc; i++) { 
      if (strcmp(argv[i], "-") == 0)
        ret = palindromes(stdin);
      else if ((fp = fopen(argv[i], "r")) != NULL) {
        ret = palindromes(fp);
        fclose(fp);
      } else {
        fprintf(stderr, "%s: %s: could not open: %s\n",
                argv[0], argv[i], strerror(errno));
        exit_code = ERROR;
      }
      if (ret == ERROR) {
        fprintf(stderr, "%s: %s: error: %s\n",
                argv[0], argv[i], strerror(errno));
        exit_code = ERROR;
      } else if (ret == MATCH && exit_code != ERROR) 
        // return MATCH if at least one line is a MATCH, propogate error
        exit_code = MATCH;
    }
  }
  return exit_code;
}

Чтобы адаптировать его к C ++: напишите функцию (это palindromes выше), которая принимает std::istream&;передайте ему либо std::cin (для стандартного ввода, либо '-' имя файла), либо ifstream объекты из функции main().

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

1 голос
/ 13 декабря 2010

Я не могу найти ссылку на комментарий, поэтому оставьте ответ. Как сказал Евгений Константин Динка, канал или перенаправление просто выводят на стандартный ввод, поэтому ваша программа должна читать со стандартного ввода.

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

<Ч />

Edit:

int c;
while(-1 != (c = getchar()))
    putchar(c);
0 голосов
/ 13 декабря 2010

Возможно, я неверно истолковал вопрос, но я думаю, что вы хотите, чтобы ваша программа могла использоваться следующим образом: cat [some_file] | [your_program] или [your program] < [some_file].
Если это так, то вам просто нужно прочитать из стандартного ввода(stdin / cin), оболочка позаботится обо всем остальном.

Если вы хотите, чтобы ваша программа читала из stdin или из файла, вы можете делать то же, что и ряд утилит командной строки, то есть cat :

cat [ОПЦИЯ] [ФАЙЛ] ...
...
Без ФАЙЛА или когда ФАЙЛ - -, читать стандартный ввод.

Пример кода, реализующего описанное выше, см. в этой статье.

0 голосов
/ 13 декабря 2010

Я думаю, это именованная труба, с которой вы хотите работать.Но из того, что я знаю, другая программа должна записать свой вывод в именованный канал (если у вас есть доступ к этой программе, вы можете это сделать), и ваша программа будет читать из именованного канала.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...