C 使用fopen()时出现分段错误
我不知道为什么会发生这种情况,但我从这个非常简单的代码中得到了一个“分段错误(内核转储)”。你知道为什么吗?我必须使用字符串来告诉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
#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课程中都应该学习的基础。