文件处理函数调用错误

时间:2016-12-13 11:14:13

标签: c

我从教科书中找到了一个问题,让我们来自Yeshavant Kanethkar。问题是你必须在以下程序中找到错误:

#include<stdio.h>
void openfile(char *, FILE **);
int main()
{
    FILE *fp;
    openfile( "Myfile",fp);
    if(fp==NULL)
        printf("Unable to open file...\n");
    return 0;
}
void openfile(char *fn, FILE **f)
{
    *f=fopen(fn,"r");
}

答案是“没有错误”,但我不相信,因为在调用文件打开函数时我们应该通过引用调用它:

openfile("Myfile",&fp);

无误地使用此程序。

我的理解是正确的,还是正确的教科书?

1 个答案:

答案 0 :(得分:2)

表达

  openfile("Myfile", &fp);

而不是

  openfile("Myfile", fp);

使程序完成。

openfile("Myfile", fp)的问题在于指针类型:如果声明FILE *fp;FILE **获取类型fp,则需要指针地址和一元&可以帮忙。

编译器可以在没有错误消息的情况下进行编译,因为FILE *FILE **都是指针并且隐式转换有效,但通常会针对此类情况显示警告。

我的Visual Studio警告如下:

  

警告1警告C4047:&#39;功能&#39; :&#39; FILE **&#39;不同的间接水平来自&#39; FILE *&#39; c:\ users \ user \ documents \ visual studio 2013 \ projects \ consoleapp \ source.c 10

<强>更新

尝试以下更新程序:

#include<stdio.h>
void openfile(char *, FILE **);

int main()
{
    FILE *fp = NULL;
    printf("Before:\n");
    printf("value of fp = %p\n", fp);
    printf("address of fp = %p\n", &fp);
    openfile("Myfile", &fp);
    printf("After:\n");
    printf("value of fp = %p\n", fp);
    printf("address of fp = %p\n", &fp);
    if (fp == NULL)
        printf("Unable to open file...\n");
    return 0;
}

void openfile(char *fn, FILE **f)
{
    printf("Inside (before):\n");
    printf("value of f = %p\n", f);
    printf("value of *f = %p\n", *f);
    *f = fopen(fn, "r");
    printf("Inside (after):\n");
    printf("value of f = %p\n", f);
    printf("value of *f = %p\n", *f);
}

如果您的程序可以打开文件,您会看到类似

的内容
Before:
value of fp = 00000000
address of fp = 0019F9B0
Inside (before):
value of f = 0019F9B0
value of *f = 00000000
Inside (after):
value of f = 0019F9B0
value of *f = 580E7350
After:
value of fp = 580E7350
address of fp = 0019F9B0

这里我们看到地址,并且在调用openfile

之后更改了fp的值