【初阶与进阶C++详解】第二十七篇:C++的IO流(标准IO流+文件IO流+stringstream)

🏆个人主页企鹅不叫的博客

​ 🌈专栏

⭐️ 博主码云gitee链接:代码仓库地址

⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!

💙系列文章💙

【初阶与进阶C++详解】第一篇:C++入门知识必备

【初阶与进阶C++详解】第二篇:C&&C++互相调用(创建静态库)并保护加密源文件

【初阶与进阶C++详解】第三篇:类和对象上(类和this指针)

【初阶与进阶C++详解】第四篇:类和对象中(类的六个默认成员函数)

【初阶与进阶C++详解】第五篇:类和对象下(构造+static+友元+内部类

【初阶与进阶C++详解】第六篇:C&C++内存管理(动态内存分布+内存管理+new&delete)

【初阶与进阶C++详解】第七篇:模板初阶(泛型编程+函数模板+类模板+模板特化+模板分离编译)

【初阶与进阶C++详解】第八篇:string类(标准库string类+string类模拟实现)

【初阶与进阶C++详解】第九篇:vector(vector接口介绍+vector模拟实现+vector迭代器区间构造/拷贝构造/赋值)

【初阶与进阶C++详解】第十篇:list(list接口介绍和使用+list模拟实现+反向迭代器和迭代器适配)

【初阶与进阶C++详解】第十一篇:stack+queue+priority_queue+deque(仿函数)

【初阶与进阶C++详解】第十二篇:模板进阶(函数模板特化+类模板特化+模板分离编译)

【初阶与进阶C++详解】第十三篇:继承(菱形继承+菱形虚拟继承+组合)

【初阶与进阶C++详解】第十四篇:多态(虚函数+重写(覆盖)+抽象类+单继承和多继承)

【初阶与进阶C++详解】第十五篇:二叉树搜索树(操作+实现+应用KVL+性能+习题)

【初阶与进阶C++详解】第十六篇:AVL树-平衡搜索二叉树(定义+插入+旋转+验证)

【初阶与进阶C++详解】第十七篇:红黑树(插入+验证+查找)

【初阶与进阶C++详解】第十八篇:map_set(map_set使用+multiset_multimap使用+模拟map_set)

【初阶与进阶C++详解】第十九篇:哈希(哈希函数+哈希冲突+哈希表+哈希桶)

【初阶与进阶C++详解】第二十篇:unordered_map和unordered_set(接口使用+模拟实现)

【初阶与进阶C++详解】第二十一篇:哈希应用(位图实现应用+布隆过滤器增删查优缺点+海量数据面试题)

【初阶与进阶C++详解】第二十二篇:C++11新特性(列表初始化+变量类型推到+右值引用+新增默认成员函数+可变模板参数+lambda表达式+包装器function_bind)

【初阶与进阶C++详解】第二十三篇:异常(异常抛出+异常捕获+异常优缺点)

【初阶与进阶C++详解】第二十四篇:智能指针(内存泄漏+RAII+auto_ptr+unique_ptr+shared_ptr+weak_ptr+定制删除器)

【初阶与进阶C++详解】第二十五篇:类型转换(static_cast+reinterpret_cast+const_cast+dynamic_cast+RTTI)

【初阶与进阶C++详解】第二十六篇:特殊类设计(单例模式)



💎一、C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类

在这里插入图片描述

🏆1.C++标准IO流

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出 ,在使用时候必须要包含文件并引入std标准命名空间。

  1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据
  2. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载
  3. istream类型对象转换为逻辑条件判断值
istream& operator>> (int& val);
explicit operator bool() const;

实际上我们看到使用while(cin>>i)去流中提取对象数据时,调用的是operator>>,返回值是istream类型的对象,那么这里可以做逻辑条件值,源自于istream的对象又调用了operator bool,operator bool调用时如果接收流失败,或者有结束标志,则返回false

🏆2.C++文件IO流

和C语言一样,C++根据文件内容的数据格式将文件分为二进制文件和文本文件,包含头文件< fstream >。

  1. 定义一个文件流对象

    操作场景
    ofstream (只输出用)只写
    ifstream (只输入用)只读
    fstream (既输入又输出用)读+写
  2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系

    打开方式功能
    in以读的方式打开文件
    out以写的方式打开文件
    binary以二进制方式对文件进行操作
    ate输出位置从文件的末尾开始
    app以追加的方式对文件进行写入
    trunc先将文件内容清空再打开文件
  3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写

    成员函数功能
    put插入一个字符到文件
    write插入一段字符到文件
    get从文件提取字符
    read从文件提取多个字符
    tellg获取当前字符在文件当中的位置
    seekg设置对文件进行操作的位置
    >>运算符重载将数据形象地以“流”的形式进行输入
    <<运算符重载将数据形象地以“流”的形式进行输出
  4. close()关闭文件

int main()
{
	ifstream ifs("Test.cpp");//(输入用)
	ofstream ofs("Copy.cpp");//创建一个新文件Copy.cpp(输出用)

	while (ifs)
	{
		char ch = ifs.get();//将Test.cpp文件按照一个一个字符读出
		ofs << ch;
		cout << ch;

	}

	return 0;
}

💎二、stringstream

在程序中如果想要使用stringstream(流的输入输出操作),必须要包含头文件 < sstream >

  1. 将数值类型数据格式化为字符串

    int main()
    {
    	int a = 10;
    	string ss;
    	stringstream s;
    	s << a;//将int类型的a放入到输入流
    	s >> ss;//从s中抽取前面插入的int类型的值,赋值给string类型
    	cout << ss << endl;
    	s.str("");//将stringstream底层管理的string对象设置为""
    	s.claer();//将上一次转换状态秦清除
    	return 0;
    }
    
  2. 字符串拼接

    int main()
    {
    stringstream sstream;
    // 将多个字符串放入 sstream 中
    sstream << "first" << " " << "string,";
    sstream << " second string";
    cout << "strResult is: " << sstream.str() << endl;
    return 0;
    }
    
  3. 序列化和反序列化结构数据

    struct A
    {
    	char arr[100];
    	int a;
    };
    int main()
    {
    	stringstream ss;
    	ss.str("abc 123");//设置字符串内容,字段之间用空格隔开
    	A tmp;
    	ss >> tmp.arr >> tmp.a;
    	cout << tmp.arr << " " << tmp.a << endl;
    	return 0;
    }
    
  1. stringstream实际是在其底层维护了一个string类型的对象用来保存结果。
  2. 多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的
  3. string对象清空。
  4. 可以使用s. str(“”)方法将底层string对象设置为""空字符串。
  5. 可以使用s.str()将让stringstream返回其底层的string对象。
  6. stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

penguin_bark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值