检查C中的输入流是否为空

Check if the input stream is empty in C

我正在学习C语言,我的程序遇到了问题。

所以,我有一个名为 TEST 的程序,这个程序应该允许我使用 argv[] 或使用输入流 $ TEST < argsTest.json.

来读取参数
argsTest.json :
{
"a" = 2,
"b" = 3
}

为了简化我的问题,我将使用这个简单的程序:

Struct {
    int a;
    int b;
} number;

int main(int argc, char **argv) {
    json_t * root;
    struct number numbers;
    int c = 0, i = 0 , result;
    char str[1024]; // I'm not using malloc just to simplify my question
    // default values
    numbers.a = 0;
    number.b = 0;

    if (argc == 1 && !feof(stdin)) {
        while((c = fgetc(stdin)) != EOF) {
            str[i]=c;
            ++i;
        }
        str[i] = '[=11=]';

        .... // code that use jansson library to extract value

        /** let's suppose we have extracted the two value int json_a
          * and int json_b.
          */

        numbers.a = json_a;
        numbers.b = json_b;

    } else if (argc == 3) {
        scanf("%d", numbers.a);
        scanf("%d", numbers.b);
    }

    result = numbers.a + number.b;
    printf("%d\n", result);

    return 0;
}

所以,我正在尝试实现三种行为:

  1. $ TEST 它应该显示 0 (我们使用默认值)。
  2. $ TEST < argsTest.json显示5
  3. $ TEST 4 3显示7.

我的问题是 if 语句 if (argc == 1 && !feof(stdin)) 实际上 $ TEST$ TEST < argsTest.json有相同的语句argc == 1,所以 当 运行 $ TEST 它会出错,因为他进入了第一个条件。

我想要一个 if 语句来检查输入流是否为空并具有 0 参数,这样我就可以在不进入 if 语句的情况下实现第一种情况。

谢谢。

大意是

  • 首先检查 argc,看看您是否应该使用 argv
  • 中的值
  • 检查终端是否交互式
    • 如果是则打印 0
    • 如果它不是交互式的,那么您可以阅读 stdin

问题是没有可移植的方法来检查 stdin 是否是交互式的。但是,在 POSIX 系统上,您可以使用 isatty 函数,如 explained in this question.

所以假设您在 POSIX 系统上,代码如下所示:

int main(int argc, char *argv[])
{
    struct number numbers;

    if (argc == 3)
    {
        if (sscanf(argv[1], "%d", &numbers.a) == 1 && sscanf(argv[2], "%d", &numbers.b) == 1)
            printf("From argv the answer is %d\n", numbers.a + numbers.b);
        else
            printf("Bad strings in argv\n");
    }
    else if (isatty(STDIN_FILENO))
    {
        printf("Nothing in argv or on stdin, so the answer is 0\n");
    }
    else
    {
        if (scanf("%d%d", &numbers.a, &numbers.b) == 2)
            printf("From stdin the answer is %d\n", numbers.a + numbers.b);
        else
            printf("Found junk on stdin\n");
    }
}