当前位置: 首页 > news >正文

如何刷新缓冲区(c++、c、linux)

目录

换行符刷新缓冲区(c和c++通用)

输入事件到来(c和c++通用)

控制符flush(c++特有)

控制符endl(c++特有)

c库函数:fflush刷新缓冲区(c特有)

sync(linux)

fsync(linux)

fdatasync (linux)


 在使用printf或者cout等将数据输出到显示器上时,数据会先进入对应的输出缓冲区,只有当缓冲区被刷新时,数据才会真正来到显示器。

换行符刷新缓冲区(c和c++通用)

#include <iostream>
#include <stdio.h>
#include <unistd.h>
using namespace std;// 换行符刷新缓冲区
int main()
{// cout不会直接将“123”输出到显示器上,而是将其发送到输出缓冲区// 输出缓冲区收到换行符后,会刷新输出缓冲区至显示器上// 也可以从面向对象的角度思考一下这个问题:// 我想要输出一些数据到显示器上// cout用于将数据输出到显示器上// 可是我想一次发一个完整的数据给显示器,那么什么时候才是这个完整的数据呢// "\n"告诉cout这个完整的数据我写完了,你去发给显示器吧cout << 123;sleep(3);cout << "\n";sleep(3);return 0;
} 

输入事件到来(c和c++通用)

#include <iostream>
#include <stdio.h>
#include <unistd.h>
using namespace std;// 输入事件到来
int main()
{// 当需要输入时,会刷新输出缓冲区至显示器上cout << "enter a number: ";int a;cin >> a;return 0;
} 

控制符flush(c++特有)

#include <iostream>
#include <stdio.h>
#include <unistd.h>
using namespace std;// 控制符flush
int main()
{cout << 123;sleep(3);// cout << flush; //--->实际上ostream类对插入运算符<<进行了重载。cout << flush被替换成flush(cout)flush(cout);sleep(3);return 0;
} 

控制符endl(c++特有)

#include <iostream>
#include <stdio.h>
#include <unistd.h>
using namespace std;// 控制符endl
int main()
{// endl也会刷新cout对应的输出缓冲区至显示器上,并添加换行符'\n'cout << 123;sleep(3);cout << endl;sleep(3);return 0;
} 

c库函数:fflush刷新缓冲区(c特有)

#include <iostream>
#include <stdio.h>
#include <unistd.h>
using namespace std;// c库函数:fflush刷新缓冲区
// int fflush(FILE *stream);
int main()
{// endl也会刷新cout对应的输出缓冲区至显示器上,并添加换行符'\n'printf("123");sleep(3);fflush(stdout);sleep(3);return 0;
}

sync(linux)

        将所有文件已修改的数据从内核缓冲区写回存储设备;将所有文件的元数据(如文件大小、权限、时间戳等)从内核缓冲区写回存储设备。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/sync.h>int main() {int fd = open("test.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("open");return 1;}const char *message = "Hello, sync!";// write并不会把数据直接写入磁盘,而是写入到该文件对应的内核缓冲区ssize_t bytes_written = write(fd, message, sizeof(message) - 1);if (bytes_written == -1) {perror("write");close(fd);return 1;}// 调用sync函数确保数据写入磁盘// 刷新所有内核缓冲区,包括这个文件和其他文件对应的内核缓冲区// 会刷新每个文件对应的内核缓冲区至各自对应的磁盘区域上sync();close(fd);return 0;
}

fsync(linux)

        将特定一个文件已修改的数据从内核缓冲区写回存储设备;将特定一个文件的元数据(如文件大小、权限、时间戳等)从内核缓冲区写回存储设备。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>int main() {int fd = open("test_fsync.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("open");return 1;}const char *message = "Hello, fsync!";ssize_t bytes_written = write(fd, message, sizeof(message) - 1);if (bytes_written == -1) {perror("write");close(fd);return 1;}// 调用fsync函数确保该文件对应内核缓冲区数据和元数据写入磁盘if (fsync(fd) == -1) {perror("fsync");close(fd);return 1;}close(fd);return 0;
}

        这里,在写入数据后,我们调用 fsyncfsync 会确保不仅文件内容(数据)被写入磁盘,而且文件的元数据,如文件大小、权限、时间戳等也被同步更新到磁盘。这对于需要严格一致性的应用场景非常重要,比如文件系统的元数据更新操作。

fdatasync (linux)

        只保证将特定一个文件对应的内核缓冲区中的数据写入到磁盘。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>int main() {int fd = open("test_fdatasync.txt", O_WRONLY | O_CREAT, 0644);if (fd == -1) {perror("open");return 1;}const char *message = "Hello, fdatasync!";ssize_t bytes_written = write(fd, message, sizeof(message) - 1);if (bytes_written == -1) {perror("write");close(fd);return 1;}// 调用fdatasync函数确保该文件内核缓冲区数据写入磁盘if (fdatasync(fd) == -1) {perror("fdatasync");close(fd);return 1;}close(fd);return 0;
}

文章转载自:

http://78pApLbX.hdzty.cn
http://qcKxyIxd.hdzty.cn
http://SSoa3POg.hdzty.cn
http://zRCX3Gwz.hdzty.cn
http://vwTHTPMb.hdzty.cn
http://YDtonCYM.hdzty.cn
http://rEjwJp1k.hdzty.cn
http://SBG4Jwvs.hdzty.cn
http://FW8k3HFs.hdzty.cn
http://pgY6noH4.hdzty.cn
http://HpJGGjzK.hdzty.cn
http://XKzeHg0a.hdzty.cn
http://j95N9nTF.hdzty.cn
http://AKo3hFck.hdzty.cn
http://u4aNwmOu.hdzty.cn
http://WpBiYtQd.hdzty.cn
http://vIeBqeyY.hdzty.cn
http://Ntqmu4eB.hdzty.cn
http://63IXFdb1.hdzty.cn
http://PKCDjKI1.hdzty.cn
http://6b1YasIu.hdzty.cn
http://vsMD44Bw.hdzty.cn
http://cnhPlxih.hdzty.cn
http://IN7FKHDC.hdzty.cn
http://vRpodEj8.hdzty.cn
http://sGd1u8UU.hdzty.cn
http://mM9HV4JD.hdzty.cn
http://r5a1Cyyw.hdzty.cn
http://Gf96SQXx.hdzty.cn
http://msyN9rcx.hdzty.cn
http://www.dtcms.com/a/248400.html

相关文章:

  • RPG27.命中时慢动作
  • druid 数据库密码加密
  • 如何在 Android 和 iPhone 上发送群组文本
  • 从弦到膜:在1D和2D云环境中探索波动方程-AI云计算数值分析和代码验证
  • codeforces 958E1. Guard Duty (easy)
  • 软件开发 | 从 Azure DevOps迁移至GitHub企业版的最佳路径
  • Rust 学习笔记:Stream
  • 光谱数据分析的方法有哪些?
  • “交错推理”降低首token耗时,并且显著提升推理准确性!!
  • 使用 PyMuPDF 和 PySide6/PyQt6 编写的 PDF 查看器 (显示树状书签和缩略图列表,没有文字选择功能)
  • 异步爬虫---
  • C++11 Generalized(non-trivial) Unions:从入门到精通
  • 音乐调性关系与音准训练指南
  • 深刻理解深度学习的注意力机制Attention
  • vLLM用2*(8 H800)部署DeepSeek-R1-0528-685B
  • ubuntu 拒绝ssh连接,连不上ssh,无法远程登录: Connection failed.
  • 第18篇:数据库中间件架构中的服务治理与限流熔断机制设计
  • [Java恶补day24] 74. 搜索二维矩阵
  • 【MacOS】系统数据占用超大存储空间,原因、定位、清理方式记录
  • vue常用框架,及更新内容
  • ServiceNow培训第1期
  • 50种3D效果演示(OpenGL)
  • openeuler 虚拟机:Nginx 日志分析脚本
  • 从开发到上线:iOS App混淆保护的完整生命周期管理(含Ipa Guard)
  • 直角坐标系-zernike多项式波面拟合
  • 初学时间复杂度
  • MRI中的“髓鞘探测器”:T1w/T2w比值揭秘
  • LeetCode 744.寻找比目标字母大的最小字母
  • 【C++特殊工具与技术】优化内存分配(六):运行时类型识别
  • 用 PlatformIO + ESP-IDF 框架开发 ESP32