【问题标题】:Segmentation fault when not specifying input file on command line未在命令行上指定输入文件时出现分段错误
【发布时间】:2020-02-08 00:46:41
【问题描述】:

我正在编写一个程序,它从作为参数传递的文件中读取,如果没有给出参数,则从标准输入读取。 代码在传递文件的情况下运行良好,但是当没有文件传递时出现段错误。 如果给出了文件,我基本上会在 argv[1] 上调用 fopen,但如果没有给出文件,我会调用:

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

这是将标准输入作为文件打开的正确语法吗?

【问题讨论】:

  • 你不需要手动打开stdin,操作系统会处理这个。所以你只需使用stdin
  • 我正在尝试使程序与 f 一起工作,无论它是 txt 文件还是标准输入,所以如果没有传递文件 arg,我必须让 f 指向标准输入。
  • 我明白你的意思了我不需要手动打开stdin我可以设置f = stdin,谢谢。

标签: c file stdin


【解决方案1】:

当你启动一个程序时,main() 函数并不是第一个 get 被调用,在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 的函数,然后 您很可能会遇到段错误。

【讨论】:

    【解决方案2】:

    使用 f = 标准输入; 非 f = fopen("stdin", "r");

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2012-01-03
      相关资源
      最近更新 更多