C Lang - 如何检测文件是否已用作输入参数?

C Lang - How to detect if a file has been used as input argument?

我在处理传递给我的程序的参数时遇到问题。用户应该能够提供自己的参数或在启动时提供包含参数的 JSON 文件。

个人可以在发布会上提出自己的论点。例如:

prog --x 1 --y 2

个人也可以通过文件输入发送参数(JSON)。

prog < arguments.json

我遇到的问题是试图识别文件是否已通过 stdin。更具体地说,如果用户在没有任何参数或文件输入的情况下运行程序。

我可以通过检查 argc 轻松找出是否传递了任何参数,但随后我的程序卡在验证是否传递了任何参数 stdin 通过这个 ;

[...]

char str[150];
char c;

while ((c = fgetc(stdin)) != EOF) {
    strncat(str, &c, sizeof(char));
}

[...]

在没有参数的情况下启动程序后,它位于终端等待我的输入(它不应该这样做,因为没有文件输入)。仅当用户在启动时未输入任何参数且程序尝试检查 stdin 时才会出现问题。无论如何,我在使用 fgetc 之前检查 stdin 是否为空?

不容易。有两个紧迫的问题。

  1. 如前所述,检测标准输入是否绑定到文件并不容易。您可能会使用 isatty 但可能有完全正当的理由为什么您希望将带有 真实 输入的文件发送到您的程序,而不是选项。

  2. 正如前一点所预示的,如果您使用标准输入来传递参数,那么您就无法再将其用于 "proper" 输入。现在可能是您的程序不需要输入,在这种情况下没问题。但是,如果你想提供一个带有选项 允许输入的文件,事情就开始变得困难了。

通常的处理方式是不对选项使用标准输入,而是提供另一个选项来指定要使用的文件。

例如,文件 my.options 可能包含 --x 1 --y 2,您可以 运行 您的程序是以下之一:

prog --opts-file=my_options.json
prog -o my_options.json

这需要额外的间接级别,因为您必须处理从文件中读入的命令行选项 选项,但它为 [=14= 留下了标准输入] 打算:-)