C语言程序执行时写入文件的内容未即时保存的原因是什么
现象技术原因解析
该问题的核心是C语言标准IO(stdio.h)库的缓冲机制:
C标准库为了降低磁盘IO的次数、提升读写效率,对不同类型的IO流设置了不同的默认缓冲策略,普通磁盘文件默认使用全缓冲规则:只有满足以下三个条件之一时,暂存在内存缓冲区中的内容才会被真正写入磁盘文件:
- 内存缓冲区被写满
- 手动调用
fflush()接口主动刷新对应文件流 - 对应文件流被关闭(包括程序正常退出自动关闭流的场景)
对应观测到的两个现象的具体逻辑:
- 程序调用
fprintf(ofp, "test")时,字符串"test"只被写入了用户态的stdio内存缓冲区,没有触发刷盘条件。此时程序卡在第一个getchar()调用处等待用户输入,没有后续的IO操作,所以此时直接读取磁盘上的myfile文件,看不到未刷入的"test"内容。 - 按下回车键后,
getchar()获取到输入正常返回,程序继续执行fclose(ofp)逻辑,关闭文件流的操作会自动触发缓冲区刷新,把所有未写入磁盘的内容同步到磁盘,此时再查看myfile就可以看到成功写入的"test"字符串。
如果需要在写入后立刻看到内容,只需在fprintf调用后新增fflush(ofp)手动刷新缓冲区即可,不需要等待fclose执行。
内容的提问来源于stack exchange,提问作者y J.
相关产品推荐
相关产品推荐

