从不兼容的指针类型传递'fopen'的参数1?

时间:2014-08-03 05:47:53

标签: c

我在这段代码中被困了一段时间:

#include <stdio.h>

const char *fn; int a;

int exists(const char *fname)
{
    FILE *file;
    if (file = fopen(fname, "r"))
    {
        fclose(file);
        return 1;
    }
    return 0;
}

main(){

    printf("Name:\n");
    scanf("%s",&fn);

    a=exists(&fn)

    if(a==0){
        fopen(&fn,"w");
        fprintf(fn,"banhdhsjha");
    }
}

当我尝试运行该程序时,它会一直运行到fprintf(fn,"banhdhsjha");,但它崩溃了(Windows gives me an error)并且编译器(CodeBlocks)给了我以下注意事项:

  

从不兼容的指针类型传递'fopen'的参数1。

我试图让fprintf在文件中写入数据,但我不知道该怎么做。你能救我吗?

1 个答案:

答案 0 :(得分:5)

您的代码中存在很多问题。

  1. 您正在将&fn传递给scanf。此&fn是指向const char **类型指针的指针。这根本不符合逻辑。格式说明符%s需要const char *参数,而不是const char **。您基本上使用指针fn本身作为文件名的目标缓冲区(4或8个字节长,具体取决于您的平台的指针大小)。很可能你输入的文件名比#34;缓冲区&#34;更长。可以容纳。这会覆盖程序中的内存并导致不可预测(未定义)的行为。
  2. 正确的形式可能是scanf("%s", fn),但问题是你从未为目标缓冲区分配内存。您必须确保fn指向足够大小的char缓冲区来保存您的文件名。
  3. 你的fopen(&fn,"w")遇到了同样的问题(这就是编译器告诉你的)。 fopen期望const char *类型的参数,而您传递的是const char **。正确的形式是fopen(fn,"w"),但是再次看到2.此外,fopen返回一个您应该存储并稍后使用的文件句柄。您忽略(丢弃)fopen的返回值。这也没有意义。您需要一个额外的FILE *变量来存储fopen的返回值。您已经知道,根据您在exists函数中的操作判断,但不知何故,您忽略了main中的知识。
  4. 你的fprintf电话也毫无意义。 fprintf需要文件句柄(FILE *类型)作为其第一个参数。相反,您试图传递一个文件名。这不会起作用,而且还会触发编译器的诊断消息。您应该存储fopen的返回值(正如我在3中所述)并将其传递给fprintf
  5. 您的exists(&fn)通话遇到与1和3相同的问题,并产生与fopen通话相同的诊断讯息。
  6. 停止尝试编写随机代码。你在哪里想到将文件名传递给fprintf而不是文件句柄?阅读您尝试使用的每个功能的文档并采取相应措施。