在我使用fwrite()
关闭流后,我遇到了fclose()
成功的奇怪行为,但由于fflush()
失败,文件未被覆盖。
我的代码是:
int main(int argc, char* argv[])
{
FILE* file = fopen("file.txt", "w");
if(!file) perror("Cannot open the file.\n");
char text[] = "1234567";
fclose(file);
int count_of_written_objects = fwrite(text, sizeof(text),1, file);
printf("Count of written objects into the file: %d \n", count_of_written_objects);
if(count_of_written_objects != 1) perror("Not expected count of objects was written.\n");
int success = fflush(file);
printf("Variable success: %d \n", success);
if(success == EOF) perror("Flush did not succeed. \n");
return 0;
}
它提供以下输出:
Count of written objects into the file: 1
Variable success: -1
Flush did not succeed.
: Bad file descriptor
关闭流时,fwrite()
如何成功?可以fwrite()
在封闭的流上写吗?你能解释一下吗?
答案 0 :(得分:6)
在文件关闭后尝试对文件执行任何操作时,您正在处理未定义的行为。
库实现者假定调用者有责任以特定顺序发出调用,因此库可能会也可能不会尝试验证那些不是真的情况。对此类情况的验证主要是为了提高性能并减少代码大小。
如果您尝试写入之前为free
的内存位置,则会发生同样的情况。即使看起来好像一切正常,你也在调用未定义的行为。
从技术上讲,在特定情况下,写入成功是不可能的,因为库函数fclose
很可能会在底层描述符上调用close
系统调用,以及对该描述符的任何后续write
系统调用(最终由fwrite
调用)都应该失败,因为它将被内核拒绝。