首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fclose()在fclose()之后成功

fclose()在fclose()之后成功
EN

Stack Overflow用户
提问于 2014-05-30 11:59:56
回答 1查看 1.3K关注 0票数 2

我遇到了一种奇怪的行为,在我用fwrite()关闭流之后,fclose()成功了,但是文件没有被覆盖,因为fflush()失败了。

我的代码是:

代码语言:javascript
复制
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;
}

它提供了以下输出:

代码语言:javascript
复制
Count of written objects into the file: 1 
Variable success: -1 
Flush did not succeed. 
: Bad file descriptor

当流关闭时,fwrite()如何成功?fwrite()可以在封闭流上写入吗?你能给我解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-30 12:05:46

试图在文件关闭后对其执行任何操作,您将处理未定义的行为。

库实现者假定调用者有责任按一定的顺序发出调用,因此库可能尝试验证不正确的情况,也可能不尝试验证。为了提高性能和减少代码大小,忽略了对此类情况的验证。

如果您试图写入以前是freed的内存位置,也会发生同样的情况。尽管看起来一切看起来都正常,但您正在调用未定义的行为。

从技术上讲,在特定的情况下,写入不可能成功,因为库函数fclose很可能会调用底层描述符上的close系统调用,任何后续的write系统调用(最终由fwrite调用)都应该失败,因为它将被内核拒绝。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23954102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档