【问题标题】:Segmentation Fault when using fopen()使用 fopen() 时出现分段错误
【发布时间】:2018-04-05 03:25:24
【问题描述】:

我不确定为什么会发生这种情况,但我从这个非常简单的代码中得到了“分段错误(核心转储)”。关于为什么的任何想法?我必须用一个字符串告诉 fopen() 打开什么文件。

#include <stdio.h>
#include <string.h>

int main(void) {
    char *small = "small.ppm";
    FILE * fp;
    char word[5];
    fp = fopen(small, "r");
    fscanf(fp, "%s", word);
    printf("%s\n", word);

    return 0;
}

【问题讨论】:

  • fp 可能是NULL(您没有检查fopen 是否成功)。您要阅读的单词有多大?
  • 第一行只是一个简短的 2 字符行,上面写着“P3”,这就是我在这种情况下要阅读的全部内容。 small.ppm 文件本身有 10 行代码,其中大部分包含一张非常小的图片的 RGB 值。

标签: c fopen


【解决方案1】:

如果文件不存在,fp 将为 NULL,因此fscanf(fp, ...) 将出现段错误。

检查所有文件操作是否成功很重要。通常的模式类似于...

FILE *fp = fopen(filename, "r");
if( fp == NULL ) {
    fprintf(stderr, "Couldn't open %s: %s\n", filename, strerror(errno));
    exit(1);
}

【讨论】:

    【解决方案2】:

    您的代码可能会调用未定义的行为,替换为:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        char *small = "small.ppm";
        FILE * fp = fopen(small, "r");
        if (fp == NULL) {
            perror("fopen()");
            return EXIT_FAILURE;
        }
        char word[5];
        if (fscanf(fp, "%4s", word) != 1) {
            fprintf(stderr, "Error parsing\n");
            return EXIT_FAILURE;
        }
        printf("%s\n", word);
    }
    

    【讨论】:

    • @ChristianLindemann 好吧,你得到了你的问题,你的程序无权访问你的文件,所以它无法打开它。在控制台中尝试chmod +r small.ppm
    • 对您所做的更改进行更多解释将大大增加答案的价值。
    • @Kami 我认为假设您已经花了一个多小时阅读“如何编写 C”,那么它对于发生的变化是非常不言自明的。
    • @Kcvin 我敢打赌,很多有 C 编程的学生在两个学期后都不能完全理解它。我只是认为一个好的答案必须包含的不仅仅是固定代码。
    • @KamiKaze “错误检查/处理”是编程学生在任何 101 课程中都应该学习的基础知识。
    猜你喜欢
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2017-06-06
    • 2017-08-26
    • 2018-06-18
    相关资源
    最近更新 更多