在另一个函数中使用fopen()

时间:2014-05-28 23:49:39

标签: c fopen

我正在尝试使用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中它运行正常。任何人都可以给我一点见解吗?

谢谢。

2 个答案:

答案 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);

其中&是地址运算符,它返回该变量的地址。