如果的问题..==C 中的空

  • 本文关键字:如果 问题 c null fopen
  • 更新时间 :
  • 英文 :


我有这个代码,请注意它被缩短了。问题是文件是否存在 它仍然覆盖它。我已经30年没有做过任何编程了,所以请耐心等待。谢谢!

FILE *openFil(FILE *open, char namn[]);
int main(int argc, const char * argv[])
{
FILE *openFil(FILE *open, char namn[]);
FILE *anmal =NULL;
char filNamn[] = "ANMAL.DAT";
postTypAnm pAnm;
anmal = openFil(anmal, filNamn);
}
FILE *openFil(FILE *pointer, char name[])
{
if ((pointer =fopen(name, "r+b"))== NULL)
if ((pointer =fopen(name, "w+b"))== NULL)
{
/* It Enters here as well, but it should not do that or????? */
printf("errorn");  
exit(0);
}
return pointer;
}

如果您使用的是 C11 标准,则可以使用"x"参数来指定如果文件存在,则fopen()函数将失败。

供参考:http://www.cplusplus.com/reference/cstdio/fopen/

这是一个工作示例。

#include <errno.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool openFile(FILE **ptr,
const char *fileName);
int main(int argc, const char * argv[]) {
FILE *anmal = NULL;
const char *fileName = "ANMAL.DAT";
if(!openFile(&anmal, fileName)) {
exit(EXIT_FAILURE);
}
}
bool openFile(FILE **ptr,
const char *fileName)
{
*ptr = fopen(fileName, "w+bx");
if(!*ptr) {
perror("Error opening file: ");
return false;
}
return true;
}

这是使用 GNU C 中的x扩展名来测试文件是否存在。

正如其他人指出的那样,您的原始代码中存在许多问题。

  • 您已在main中为openFil重新声明了函数原型。
  • openFil中,接受FILE指针作为 一个参数,并用返回值覆盖它。特别是如果 您希望输入一个NULL指针并使用该函数 初始化它。使用指针到指针作为参数,以便 可以修改函数内的指针,或完全忽略它 并使用函数的返回值设置其值。不能两者兼而有之。
  • 您实际上根本不在测试该文件是否存在。根据fopen(man fopen(的手册页,你在打开文件时使用的标志(r+w+(都不关心文件是否存在。r+打开以进行读取/写入,并始终将流定位在文件的开头。w+将打开以进行读取/写入,如果文件已存在,则截断该文件。这就解释了为什么你没有得到你想要的效果。

1.

">它也进入这里,但它不应该这样做,或者?????">

不,不应该。如果两个指针都NULL则向ANMAL.DAT打开流不成功,无论是在w+b还是在r+b模式下。证明该文件是否确实存在于可执行文件的目录中。否则,请尝试使用从根目录到文件的整个路径。

">问题是,如果文件存在,它仍然会覆盖它。">

为什么您知道该文件确实以正确的方式被覆盖?

由于if ((pointer =fopen(name, "r+b")) == NULL)if ((pointer = fopen(name, "w+b"))== NULL)都失败了,因此似乎ANMAL.DAT不存在fopen()搜索它的地方,或者在尝试打开它时发生错误(可能格式不正确或已损坏?

perror(name)放在错误例程中以检查是否已将errno设置为在name处指示错误。

<小时 />

2.

在错误例程中:如果发生了错误,exit(0)不正确。使用exit(EXIT_FAILURE).

<小时 />

旁注:

main内部,您有另一个函数openFil->FILE *openFil(FILE *open, char namn[]);的原型,这是多余的。

此外,在原型中,第二个参数的标识符在main之前与openFil定义时的标识符不同,namnname相比。

相关内容

  • 没有找到相关文章

最新更新