我有这个代码,请注意它被缩短了。问题是文件是否存在 它仍然覆盖它。我已经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
定义时的标识符不同,namn
与name
相比。