打开多个文件的C语言fopen函数

9
在我的软件中,我需要按顺序读取多个txt数据库,所以我先读取第一个文件,然后对从该文件获取的信息进行处理,接着打开另一个文件进行写入,以此类推。
有时候在打开或创建一个文件时会出现错误,然后我就会在所有后续的打开/创建操作中出现错误,这些操作使用不同的函数、变量和文件。
例如,我调用下面的函数,它使用两个文件,然后出现错误“* error while opening file -%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);

2
使用 perror 查找导致错误的原因。 - Fred Foo
3个回答

9
  1. 对于给定的进程,有打开句柄数量的上限。也许你的程序存在句柄泄漏?

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

  3. 这些错误日志消息属于你的程序。你可以进一步改进它。由于fopen本质上是一个系统调用,因此操作系统会设置一个错误号errnum。你可以打印该错误号并获取更多关于你的问题的信息。


正如larsmans所建议的那样,我使用perror得到了“打开的文件太多”的错误。因此,我认为问题出在您提到的第一点上。我的程序会不断循环,因此如果我忘记关闭一个文件,在一些迭代后,我可能会达到限制。我可以同时打开多少个文件? - phcaze
可能是没有关闭文件夹的问题吗?使用closedir()函数。 - phcaze

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

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接