【问题标题】:How to use UNIX terminal input redirection in C?如何在 C 中使用 UNIX 终端输入重定向?
【发布时间】:2012-01-11 05:30:22
【问题描述】:

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

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

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

./sort 1 < test.txt

我该怎么做?

非常感谢任何帮助 谢谢!

【问题讨论】:

  • 您要单独传递文件名还是从命令行传递完整数据?
  • 命令行中的文件名和字段,但我希望文件名和字段作为单独的值
  • 然后只使用命令行参数。在 main() 中使用 argc & argv
  • AusCBloke 绝对符合您想要实际完成的任务的描述。如果您像最初设想的那样使用重定向,则该文件的内容将通过管道传输到程序。我的任务是教授想要一个交互式程序,但给了我们一个带有空格分隔输入的文件,因此我们可以使用这样的重定向,从程序的角度来看,与用户手动输入文件内容没有区别.与这种情况无关,但可能很高兴知道它的可能性。
  • 非常感谢 matt 的输入

标签: c unix input terminal redirect


【解决方案1】:

首先,您在代码中以错误的方式获取参数。如果您想要运行您的程序,例如./sort &lt;option&gt; &lt;filename&gt;,那么您不要使用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 之类的东西。在这种情况下可能没有必要,但这是一种选择。


您可以使用 atoistrtol 解析整数选项,但您喜欢,将其从字符串 (char*) 转换为整数类型和 fopenfgetsfclose 以从输入文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-17
    • 2014-04-30
    • 2012-01-11
    • 1970-01-01
    • 2021-01-27
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多