如何在C中使用UNIX终端输入重定向?

时间:2011-12-02 05:13:42

标签: c unix input terminal redirect

我有这个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;
}

但是我没有执行程序并从stdin读取,而是希望它从unix终端读取,以便:

./sort [field] < input_file

将读入该文件。 (如果没有输入输入,则[field]为选项,默认为1)。

例如,在UNIX中执行C程序的命令如下所示:

./sort 1 < test.txt

我该怎么做?

任何帮助都很有用 谢谢!

1 个答案:

答案 0 :(得分:4)

首先,你的代码中的参数是错误的。如果您想要运行./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或{{1 }}。这种情况可能没必要,但它是一种选择。


您可以使用./sort --opt 5 --file test.inatoi解析整数选项,无论如何,将其从字符串(strtol)转换为整数类型char*,{{1 },fopen从输入文件中读取。