8

在我的软件中,我必须以串行方式读取多个 txt 数据库,所以我读取第一个,然后使用从该文件中获得的信息做一些事情,然后再打开另一个进行写入,依此类推。

有时我在打开或创建文件时遇到错误,然后在所有以下打开/创建时遇到错误,这些打开/创建使用不同的函数、不同的变量、不同的文件。

因此,例如我调用下面的函数,它使用两个文件,我得到一个错误“*打开文件时出错 -%s-..\n”,然后我的代码中的所有其他 fopen() 都出错了!

这是单个文件的代码示例:

FILE *filea;
if((filea=fopen(databaseTmp, "rb"))==NULL) {
    printf("* error while opening file -%s- ..\n",databaseTmp);
    fclose (filea);
    printf("---------- createDatabaseBackup ----------\n");
    return -1;
}
int emptyFolder=1;
FILE *fileb;
if((fileb=fopen(databaseBackup, "ab"))==NULL) {
    printf("* error while opening file -%s- ..\n",databaseBackup);
    fclose (fileb);
    printf("---------- createDatabaseBackup ----------\n");
    return -1;
}
else {
    int i=0;
    char c[500]="";
    for (i=0;fgets(c,500,filea);i++) {
        fprintf(fileb,"%s",c);
        emptyFolder=0;
    }
} 
fclose(fileb);
fclose(filea);
4

3 回答 3

9
  1. 给定进程的打开句柄数有上限。可能是您的程序中有句柄泄漏?

  2. 创建文件时出错通常意味着您没有对父文件夹的访问权限。

  3. 这些错误日志消息属于您的程序。您可以进一步增强它。操作系统有一个errnum集合,fopen本质上是一个系统调用。您可以打印该错误号并获取有关您的问题的更多信息。

于 2012-05-19T10:25:29.790 回答
3

如果fopen返回 NULL,则文件未打开,因此尝试打开fclose它没有意义。

于 2012-05-19T10:24:26.360 回答
0

您应该检查除此之外的返回值fgets是否为 0。如果它读取 500 个字符并且缓冲区不是以 null 结尾的,则 fprintf 将尝试写入比分配给更多的字符c

于 2012-05-19T10:24:21.283 回答