fflush在Visual C ++ 2010上失败

时间:2011-04-12 05:01:32

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

我正在尝试运行一些代码,但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);
    }

2 个答案:

答案 0 :(得分:1)

奇怪的是,这种行为似乎是由于您将'c'模式传递到fopen来电。帮助说明了这面旗帜:

  

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

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

答案 1 :(得分:0)

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

UPD: 根据评论的澄清,我的建议并不完全正确。 Microsoft CRT对读取流上的fflush具有特殊含义。它清除了ungetc

的影响