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

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

专栏

  • C语言初阶和进阶
  • C项目
  • Leetcode刷题
  • 初阶数据结构与算法
  • C++初阶和进阶
  • 《深入理解计算机操作系统》
  • 《高质量C/C++编程》
  • Linux

⭐️ 博主码云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流
    • 1.C++标准IO流
    • 2.C++文件IO流
  • 二、stringstream


一、C++IO流

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

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

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类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全。

你可能感兴趣的:(#,C++初阶和进阶,c++,算法,开发语言)