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

标签 c file stdin

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

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

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

最佳答案

当你启动一个程序时,main()函数并不是第一个执行的事情。 get 被调用,在 main() 函数调用之前发生了很多事情 叫。其中之一是打开 stdin、stdout 和 stderr。在 一般来说,您无需担心操作系统如何执行此操作的细节,您 只是可以传达,当执行 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 的函数,然后 你很可能会遇到段错误。

关于c - 未在命令行上指定输入文件时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122939/

相关文章:

c - C mingw 中的变量声明

c - 在C中正确分隔字符串

c - 如何确保正确的文件权限

read.table 函数和 stdin

c++ - 对任意值类型的操作

c - 如何获取此代码中的 Days 值?

java - 当用户从图库上传图像并在textView中显示它们时,如何获取图像名称?

linux - 如何使用部分文件名查找在目录中最新创建的 .gz 文件的文件名

rust - 如何阅读打印品前的文字!信息?

c - 使用 IPC 在 while 循环内重定向 stdin