我正在尝试运行一些代码,但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);
}
答案 0 :(得分:1)
奇怪的是,这种行为似乎是由于您将'c'
模式传递到fopen
来电。帮助说明了这面旗帜:
启用相关文件名的提交标志,以便在调用fflush或_flushall时将文件缓冲区的内容直接写入磁盘
所以我不确定为什么它会导致它的行为方式。但是,如果您将其删除,则fflush
调用有效。可能是该标志撤消 fflush
清除读缓冲区并使其始终尝试清除写缓冲区的能力。
答案 1 :(得分:0)
fflush
应该刷新写缓冲区。按标准C在只读流上调用fflush
是一种未定义的行为。似乎Microsoft CRT将此类调用视为错误。无论如何,您不需要fflush
。
UPD:
根据评论的澄清,我的建议并不完全正确。
Microsoft CRT对读取流上的fflush
具有特殊含义。它清除了ungetc