1

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

2 回答 2

1

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

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

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

于 2011-04-12T05:26:45.563 回答
0

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

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

于 2011-04-12T05:09:47.210 回答