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