【问题标题】:fopen c with multiple filesfopen c 有多个文件
【发布时间】:2012-05-19 10:18:34
【问题描述】:

在我的软件中,我必须以串行方式读取多个 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);

【问题讨论】:

  • 使用perror 找出导致错误的原因。

标签: c fopen


【解决方案1】:
  1. 给定进程的打开句柄数有上限。可能是您的程序中有句柄泄漏?

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

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

【讨论】:

  • 按照 larsmans 的建议,使用 perror 我得到“打开的文件太多”。所以我认为问题出在你的观点 1. 我的程序继续循环,所以如果我忘记关闭一个文件,经过一些迭代,我可能会达到极限。我可以同时打开多少个文件?
  • 可能是没有关闭文件夹的问题?关闭()?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多