Как использовать перенаправление ввода терминала UNIX в C? - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть эта программа на C, которая получает данные от пользователя и отправляет их методу:

#include <stdio.h>
#include <string.h>
#include "constants.h"
#include "lines.h"
#include "compare.h"

//gets arguments and sends to compare.c
int main() {
   int op = 1;
   char filename[20];

   scanf("%d ", &op);
   gets(filename);
   if ((char) op + '0' < 49 || (char) op + '0' > 57) {
       printf("Error: Invalid input");
       exit(0);
   }
   readstdin(filename, op);
   return 0;
}

но вместо того, чтобы выполнять программу и читать из стандартного ввода, я хочу, чтобы она читала с терминала unix, чтобы:

./sort [field] < input_file

прочитает в файл. ([поле] является опцией, если ввод не введен, по умолчанию 1).

Например, команда для выполнения программы на C в UNIX будет выглядеть так:

./sort 1 < test.txt

Как мне это сделать?

Любая помощь очень ценится Спасибо!

1 Ответ

4 голосов
/ 02 декабря 2011

Для начала, вы получаете неверные аргументы в своем коде. Если вы хотите запустить вашу программу, например ./sort <option> <filename>, то вы не используете stdin для получения этих аргументов.

Аргументы в программе на C передаются в main с использованием следующей сигнатуры функции:

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

argc - количество аргументов командной строки, переданных программе, а argv - массив строк этих аргументов.

С пробегом ./sort 5 test.in:

  • argc будет равно 3
  • argv[0] будет "./sort"
  • argv[1] будет "5"
  • argv[2] будет "test.in"

Вам следует проверить, что значение argc равно 3, чтобы убедиться, что передано 2 аргумента ("5", "test.in"), а также имя файла ("./sort") в общей сложности 3.


Если вы хотите иметь необязательные поля, было бы лучше иметь их после обязательных, или еще лучше использовать что-то вроде getopt , где вместо этого вы могли бы иметь что-то вроде: ./sort --file test.in или ./sort --opt 5 --file test.in , Это, вероятно, не нужно для этого случая, но это вариант.


Вы можете анализировать целочисленную опцию, используя atoi или strtol, как вам угодно, чтобы преобразовать ее из строки (char*) в целочисленный тип и fopen, fgets, fclose для чтения из входной файл.

...