【问题标题】:fflush fails on Visual C++ 2010fflush 在 Visual C++ 2010 上失败
【发布时间】:2011-08-03 14:09:09
【问题描述】:

我正在尝试运行一些代码,但 fflush() 出现错误:

 Invalid file descriptor. File possibly closed by a different thread

以下是代码的相关部分:

    fhandle = fopen("dbfile.bin", "rbc");
    /* There is a valid dbfile.bin file - get file size */
    _fstat(_fileno(fhandle), &file_stat);
    printf("dbfile.bin size = %d\n", file_stat.st_size);

    g_tpd_list = (tpd_list*)calloc(1, file_stat.st_size);

    if (!g_tpd_list)
    {
        rc = MEMORY_ERROR;
    }
    else
    {
        fread(g_tpd_list, file_stat.st_size, 1, fhandle);
        fflush(fhandle);
        fclose(fhandle);
    }

【问题讨论】:

  • 通常你会在写入文件时刷新文件(以清除写入缓冲区)......你不应该因为你正在做的事情而刷新它,有什么影响你期待吗?
  • 我什么都不期待。这部分代码由讲师按原样提供。

标签: c visual-c++ stream filehandle fflush


【解决方案1】:

fflush 应该刷新写缓冲区。按照标准 C 在只读流上调用 fflush 是一种未定义的行为。 Microsoft CRT 似乎将此类调用视为错误。无论如何,您不需要fflush

更新: 根据 cmets 的澄清,我的建议并不完全正确。 Microsoft CRT 对读取流上的fflush 具有特殊含义。清除ungetc的效果

【讨论】:

  • 实际上并不是 VS 帮助所说的“如果流已打开以供输入,则 fflush 会清除缓冲区的内容。 fflush 否定了之前对 ungetc 的任何调用对流的影响'
  • @forsvarir,当然,这是我不知道的功能。但是,此代码示例中没有调用 ungetc
【解决方案2】:

奇怪的是,这种行为似乎是由于您将'c' 模式传递给您的fopen 调用而引起的。帮助说明了这个标志:

启用关联文件名的提交标志,以便在调用 fflush 或 _flushall 时将文件缓冲区的内容直接写入磁盘

所以我不确定为什么它会导致它的行为方式。但是,如果您删除它,fflush 调用将起作用。可能是这个标志取消fflush 清除读取缓冲区并使其始终尝试清除写入缓冲区的能力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多