我正在尝试使用C中的文件。我希望有一个函数接收指向FILE的指针,询问要读取的文件的名称,并将其初始化以供阅读。所以,我这样写了:
void initFileReading(FILE* fp){
char dic[40];
printf("Dictionary file: ");
scanf("%40[^\n]", dic);
fp = fopen(dic, "r");
}
int main(){
int diff, i, nWords, Len;
char str[16];
FILE* fp;
initFileReading(fp);
fscanf(fp, "%s", str);
printf("%s", str);
return 0;
}
当我尝试运行它时,我得到了一个SegFault。但是,如果我把函数中的内容放在main中它运行正常。任何人都可以给我一点见解吗?
谢谢。
答案 0 :(得分:2)
分配给fp
不会修改调用函数中的变量 - 您只有指向FILE的指针,而不是指向FILE指针的指针。但要修改调用函数中的指针,您需要完全按照:
void initFileReading(FILE** fpp){
char dic[40];
printf("Dictionary file: ");
scanf("%39[^\n]", dic);
*fpp = fopen(dic, "r");
}
int main(){
int diff, i, nWords, Len;
char str[16];
FILE* fp;
initFileReading(&fp);
fscanf(fp, "%s", str);
printf("%s", str);
return 0;
}
但是,简单地return
新打开的文件会更简洁:
FILE* initFileReading(){
char dic[40];
printf("Dictionary file: ");
scanf("%39[^\n]", dic);
return fopen(dic, "r");
}
在您的主要功能中,您只需使用fp = initFileReading();
答案 1 :(得分:0)
作为参数传递给函数的值被复制到函数内的局部变量中。因此,'initFileReading'中的'fp'是一个局部变量,当你将fopen的返回值赋给它时,你不会将该值赋给'main'中的'fp'。如果你想这样做,'initFileReading'必须接受一个指向FILE *的指针(一个内存地址)。在这种情况下,也会复制内存地址值,但是当你修改它指向的内存时,你正在修改main中的'fp'。
该功能将如下:
void initFileReading(FILE** fp){
char dic[40];
printf("Dictionary file: ");
scanf("%40[^\n]", dic);
*fp = fopen(dic, "r");
}
你称之为
initFileReading(&fp);
其中&是地址运算符,它返回该变量的地址。