Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用fopen()时出现分段错误_C_Fopen - Fatal编程技术网

C 使用fopen()时出现分段错误

C 使用fopen()时出现分段错误,c,fopen,C,Fopen,我不知道为什么会发生这种情况,但我从这个非常简单的代码中得到了一个“分段错误(内核转储)”。你知道为什么吗?我必须使用字符串来告诉fopen()要打开的文件 #include <stdio.h> #include <string.h> int main(void) { char *small = "small.ppm"; FILE * fp; char word[5]; fp = fopen(small, "r"); fscanf

我不知道为什么会发生这种情况,但我从这个非常简单的代码中得到了一个“分段错误(内核转储)”。你知道为什么吗?我必须使用字符串来告诉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;
}
#包括
#包括
内部主(空){
char*small=“small.ppm”;
文件*fp;
字符字[5];
fp=fopen(小,“r”);
fscanf(fp,“%s”,字);
printf(“%s\n”,word);
返回0;
}

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

#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);
}
#包括
#包括
内部主(空){
char*small=“small.ppm”;
文件*fp=fopen(小,“r”);
如果(fp==NULL){
perror(“fopen()”);
返回退出失败;
}
字符字[5];
如果(fscanf(fp,“%4s”,word)!=1){
fprintf(stderr,“错误解析\n”);
返回退出失败;
}
printf(“%s\n”,word);
}

如果文件不存在
fp
将为空,因此
fscanf(fp,…)
将出现故障

检查所有文件操作是否成功非常重要。通常的模式是这样的

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

fp
可能是
NULL
(您没有检查
fopen
是否成功)。你要读的单词有多大?第一行是一个两个字符的短行,读“P3”,这就是我在这个例子中要读的全部内容。small.ppm文件本身有10行代码,其中大部分包含非常小图片的RGB值。@ChristianIndemann好吧,你有问题了,你的程序无法访问你的文件,所以它无法打开它。在控制台中尝试
chmod+r small.ppm
。对您更改的内容多做一点解释将大大增加答案的价值。@Kami假设您花了一个多小时阅读“如何编写C”,我认为对更改内容的解释是不言而喻的@Kcvin我敢打赌,很多有C语言编程能力的学生在两个学期后都不能完全理解它。我只是认为一个好的答案必须包含的不仅仅是固定的代码。@KamiKaze“错误检查/处理”是编程学生在任何101课程中都应该学习的基础。