未在命令行上指定输入文件时出现段错误

问题描述 投票:0回答:2

我正在编写一个程序,该程序读取作为争论传递的文件,如果没有给出争论,则从stdin读取。传递文件时,代码运行良好,但是没有传递文件时出现段错误。如果给出了文件,我基本上会在argv [1]上调用fopen,但是如果没有给出文件,我会调用:

f = fopen("stdin", "r");

这是将stdin作为文件打开的正确语法吗?

c file stdin
2个回答
0
投票

USE f = stdin;不是f = fopen(“ stdin”,“ r”);


0
投票

启动程序时,main()功能不是调用,在main()函数被执行之前,发生了很多事情叫。这些事情之一是打开stdinstdoutstderr。在通常,您无需担心操作系统如何执行操作的细节,您只是可以中继当执行main()时,这些流是打开的,您可以使用它们。

因此,您可以执行此操作:

#include <stdio.h>

int main(int args, char **argv) {
    FILE *fp;

    if(args == 1) {
        fp = stdin;
    } else {
        fp = fopen(argv[1], "r");

        if(fp == NULL) {
            fprintf(stderr, "Unable to open %s for writing\n", argv[1]);
            return 1;
        }
    }

    // do your read operations on fp

    if(fp != stdin) {
        fclose(fp);
    }

    return 0;
}

因此,当您在不带参数的情况下调用程序时,将使用stdin,否则文件被使用。

代码崩溃的原因是因为

f = fopen("stdin", "r");

尝试打开一个字面上叫stdin的文件,您很可能不会打开有。 fopen将返回NULL,您可能不需要检查。如果你尝试使用需要FILE*指针但传递NULL的函数,然后您很可能会遇到段错误。

© www.soinside.com 2019 - 2024. All rights reserved.