2011-12-02 58 views
2

我有这个C程序从用户获取输入并将其发送到一个方法:如何在C中使用UNIX终端输入重定向?

#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 

将读入文件。 (如果没有输入,[字段]是选项,默认值为1)。

例如执行在UNIX的C程序应该是这样的命令:

./sort 1 < test.txt 

我如何去这样做呢?

任何帮助都非常熟悉 谢谢!

+0

你想单独传递文件名还是从命令行传递完整数据? –

+0

文件名和字段从命令行,但我想文件名和字段作为单独的值 –

+0

然后只需使用命令行参数。在main()中使用argc&argv –

回答

4

首先,您在代码中以错误的方式获取参数。如果你想要的是运行你的程序,如./sort <option> <filename>,那么你不用stdin来检索这些参数。

在C程序的参数被传递到主使用下面的函数签名:

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,以确保两个参数都已经过去了("5""test.in"),以及文件名("./sort")共3


如果你想拥有可选字段,最好是在强制性字段之后,或者更好的方法是使用类似getopt的字样,而不是像./sort --file test.in./sort --opt 5 --file test.in。这种情况可能没有必要,但它是一种选择。


您可以分析使用atoistrtol整数选项,但是你喜欢,把它从一个字符串(char*)转换为整型和fopenfgetsfclose从输入文件中读取。

+0

非常感谢你这是完美的 –