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

C++ | 深入理解C++的IO流:从控制台输出流到文件输出流的应用

13--C++的IO流

在C++编程中,IO(输入/输出)流是处理数据流的基本方式,它允许我们以一种非常直观和高效的方式与外部世界进行交互。本文将带你深入了解C++的IO流,从基础的输入输出操作到高级的文件操作和stringstream的应用。

1、流的概念

“流”是一个形象的比喻,描述了数据从一个地方流向另一个地方的过程。在C++中,流的概念被用来描述数据从外部输入设备(如键盘)流向内存,或者从内存流向外部输出设备(如显示器)的过程。C++的流具有有序连续和方向性的特点。

2、C语言的输入输出基础——fprintf、fscanf

在C语言中,我们通常使用scanf()printf()函数来进行输入输出操作。scanf()从标准输入设备(通常是键盘)读取数据并存储到变量中,而printf()则将数据输出到标准输出设备(通常是屏幕)。这些操作都依赖于缓冲区,它不仅简化了低级I/O的实现,还允许我们以“行”为单位进行数据处理。

笔记:在C语言中,最常用的接口是fprintf和scanf,只需要在printf和scanf的基础上,第一个参数设置为文件指针即可使用,方便快捷!

fprintf

fprintf 函数用于向指定的文件流中写入格式化的数据。它的原型如下:

int fprintf(FILE *stream, const char *format, ...);

  • stream 是指向 FILE 结构的指针,表示要写入数据的文件流。
  • format 是一个格式字符串,定义了数据的格式和类型。
  • 后面的省略号(...)表示函数可以接受多个参数,这些参数将按照 format 字符串中的格式进行格式化。

fprintf 通常用于将数据输出到文件,但它也可以用于标准输出(stdout),这时 stream 可以是 stdout 宏。

fscanf

fscanf 函数用于从指定的文件流中读取格式化的数据。它的原型如下:

int fscanf(FILE *stream, const char *format, ...);

  • stream 是指向 FILE 结构的指针,表示要从中读取数据的文件流。
  • format 是一个格式字符串,定义了期望读取的数据格式和类型。
  • 后面的省略号(...)表示函数可以接受多个参数的地址,这些参数将按照 format 字符串中的格式填充读取到的数据。

fscanf 通常用于从文件中读取数据,但它也可以用于标准输入(stdin),这时 stream 可以是 stdin 宏。

3、C++的IO流——cin/clog/cerr

C++提供了一个丰富的IO类库,其中ios是基类,其他类都是从ios派生而来。C++标准库中定义了四个全局流对象:cincoutcerrclogcin用于标准输入,cout用于标准输出,cerr用于错误输出,而clog用于日志输出。这些流的使用需要包含相应的头文件并使用std命名空间。

注意:如果没有自己修改底层,cin、clog、cerr是一样的

4、标准IO流的使用

使用cincout时,需要注意以下几点:

  • cin是一个缓冲流,输入的数据保存在缓冲区中,直到需要时才取出。
  • 输入的数据类型必须与提取的数据类型一致,否则会导致错误。
  • 空格和回车可以作为数据分格符,但字符型和字符串输入时需要注意。
  • 对于自定义类型,要支持cincout的输入输出,需要重载<<>>运算符。这样,自定义类型就可以像内置类型一样直接使用IO流。

5、文件IO流

C++中的文件IO流允许我们以文本或二进制形式读写文件。操作文件的一般步骤包括定义文件流对象、打开文件、进行读写操作以及关闭文件。

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
class Terminal2File
{
private:string _fileName;
public:Terminal2File(const string& fileName):_fileName(fileName){}void binWrite(void* file, size_t fileSize){ofstream ofs("bin_" + _fileName, ios_base::out | ios_base::binary);ofs.write(static_cast<const char*>(file), fileSize);}void txtWrite(void* file, size_t fileSize){ofstream ofs("txt_"+_fileName); // 默认就是文本输出ofs.write(static_cast<const char*>(file), fileSize);}void binRead(const string& fileName,void* file, size_t fileSize){ifstream ifs(fileName, ios_base::in | ios_base::binary);ifs.read((char*)file, fileSize);}void txtRead(const string& fileName, void* file, size_t fileSize){ifstream ifs(fileName);ifs.read((char*)file, fileSize);}
};int main()
{const char* name = "2024/8/09";Terminal2File run{ "file1" };run.binWrite(static_cast<void*>(const_cast<char*>(name)), strlen(name));run.txtWrite(static_cast<void*>(const_cast<char*>(name)), strlen(name));// 这里涉及到c++的四种类型转换 不明白的可以参考这篇博客~~(链接在代码块下方)char* p = new char [1000];memset(p, 0, 1000);run.binRead("bin_file1", p, strlen(name));cout << p << endl;run.txtRead("hahaha", p, 110);cout << p << endl;return 0;
}

关于C++中static_cast、const_cast等类型转换:C++ | 深入剖析C++中的类型转换-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LeetCode面试题Day8|LeetCode13 罗马数字转整数、LeetCode12 整数转罗马数字
  • Events and the Kernel
  • HarmonyOS NEXT星河版零基础入门(2)
  • 3-2 光敏电阻(智能应用篇)
  • 构建坚不可摧的防线:全面指南到高效信息安全管理体系
  • 力扣第五十六题——合并区间
  • 设计模式-装饰者模式
  • ubuntu创建txt
  • 2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第二弹 手搓机械臂
  • 搅拌站智能化改造,数字化管理如何助力降本增效?
  • 走心解答hashCode与equals,尽量说明白
  • Windows图形界面(GUI)-MFC-C/C++ - 树形视图(Tree Control) - CTreeCtrl
  • 超声波眼镜清洗机哪个更好用?四款清洁力强的超声波清洗机推荐
  • 24.8.9.11数据结构|链栈和队列
  • 程序人生-Hello’s P2P
  • 时间复杂度分析经典问题——最大子序列和
  • 《深入 React 技术栈》
  • Centos6.8 使用rpm安装mysql5.7
  • django开发-定时任务的使用
  • es6(二):字符串的扩展
  • es6要点
  • Fabric架构演变之路
  • Java的Interrupt与线程中断
  • Js基础知识(四) - js运行原理与机制
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • MySQL QA
  • Mysql优化
  • Netty源码解析1-Buffer
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • php面试题 汇集2
  • Redux系列x:源码分析
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SpringBoot 实战 (三) | 配置文件详解
  • SSH 免密登录
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Wamp集成环境 添加PHP的新版本
  • webpack入门学习手记(二)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 小程序 setData 学问多
  • 7行Python代码的人脸识别
  • 交换综合实验一
  • #DBA杂记1
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (70min)字节暑假实习二面(已挂)
  • (javaweb)Http协议
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (差分)胡桃爱原石
  • (分布式缓存)Redis哨兵
  • (转)linux下的时间函数使用
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET BackgroundWorker