• STL教程4-输入输出流和对象序列化


    标准I/O=标准输入+标准输出
    文件I/O=文件输入+文件输出

    一、标准输入输出流

    在这里插入图片描述
    cout是全局对象,已经和显示屏关联
    在这里插入图片描述
    cerr没有缓冲区,clog有缓冲区,cin和cout也有缓冲区

    cin.peek();偷窥下缓冲区,并不从缓冲区拿走
    cin.putback()用是将前面用get或者getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针的位置

    cout<<flush()//刷新缓冲区
    cout.put(‘a’).put(‘a’);//输出一个字符并支持链式编程
    cout.write(“aaa”,strlen(“aaa”));

    格式化输出

    1、成员方法的方式
    在这里插入图片描述
    代码

    void test06() {
    
    	int number = 10;
    	//成员方法的模式
    	cout.unsetf(ios::dec);//卸载掉默认的10进制输出方式
    	cout.setf(ios::oct);//设置为八进制输出
    	cout << number<<endl;
    	cout.setf(ios::showbase);//将隐藏的一些内容也显示出来
    	cout << number<<endl;
    	cout.unsetf(ios::oct);//卸载八进制
    	cout.setf(ios::hex);//设置为十六进制
    	cout << number << endl;
    	cout.width(10);//设置位宽
    	cout.fill('*');//设置内容填充
    	cout << number << endl;
    	cout.setf(ios::left);//设置左对齐
    	cout << number << endl;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2、通过控制符
    需要包含头文件#include
    在这里插入图片描述

    	int number2 = 10;
    	cout << hex   //设置为16进制
    		<< resetiosflags(ios::showbase)//设置显示符号位
    		<< setw(10)//设置宽度为10
    		<< setfill('$')//设置填充为$
    		<<setiosflags(ios::left)
    		<< number2
    		<< endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    二、文件操作

    文件读取

    需要包含头文件#include < fstream >//文件读写
    定义文件对象有两种方法,
    1、ifstream ism(filePath,ios::in);
    2、ifstream ism;
    ism.open(filePath, ios::in);

    	const char* filePath = "C:\\Users\\admin\\Desktop\\source.txt";
    	ifstream ism(filePath,ios::in);//只读方式打开文件
    
       //或者定义一个对象,以对象的成员方法打开文件
    	/*ifstream ism;
    	ism.open(filePath, ios::in);*/
    
    	//这里以对象为判断说明肯定重载了
    	if (!ism) {
    		cout << "打开文件失败" << endl;
    	}
    	//读文件 由于建立了管道了
    	char ch;
    	while ( ism.get(ch))
    	{
    		cout << ch;
    	}
    	//用完了关闭文件
    	ism.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    文件写入

    定义文件写入对象和定义文件读取格式一样
    ofstream osm(targetPath, ios::out | ios::app); //仅有out是覆盖模式,加上后面| ios::app是追加模式
    在后面osm.put(ch);往里添加元素

    void test07() {
    	
    	const char* filePath = "C:\\Users\\admin\\Desktop\\source.txt";
    	const char* targetPath = "C:\\Users\\admin\\Desktop\\target.txt";
    	ifstream ism(filePath,ios::in);//只读方式打开文件
    	ofstream osm(targetPath, ios::out | ios::app); //仅有out是覆盖模式,加上后面是追加模式
    
       //或者定义一个对象,以对象的成员方法打开文件
    	/*ifstream ism;
    	ism.open(filePath, ios::in);*/
    
    	//这里以对象为判断说明肯定重载了
    	if (!ism) {
    		cout << "打开文件失败" << endl;
    	}
    	//读文件 由于建立了管道了
    	char ch;
    	while ( ism.get(ch))
    	{ 
    		cout << ch;
    		osm.put(ch);
    	}
    	//用完了关闭文件
    	ism.close();
    	osm.close();
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    二进制模式读写

    新建一个Person类 将p1和p2写入文件中 p1和p2是以二进制形式存储的,上面说的普通的文本模式读取其实也是二进制形式存储的
    即使乱码也是二进制形式存储的 window上以回车和换行即/r/n两个符号作为行结束的标志 linux上仅换行作为换行/n标志
    以文本模式读取文件,会自动的将每行的/r/n换成/n,写文件会将/n换成/r/n
    但是在linxu下不管是文本模式还是二进制模式都是一样的

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    总结

    文件都是以二进制模式存储的,即使在内存里新建的对象也是二进制形式,这时就可以将对象写到文件里,而文本模式打开文件和二进制模式打开文件的区别在于,window上以回车和换行即/r/n两个符号作为行结束的标志,linux上仅换行作为换行/n标志 。以文本模式读取文件,会自动的将每行的/r/n换成/n,写文件会将/n换成/r/n,但是在linux下不管是文本模式还是二进制模式都是一样的

  • 相关阅读:
    Docker基本使用
    谷歌插件使用&开发
    【分类网络】LeNet
    前端---CSS的盒模型
    数据库表数据类型datetime 和 timestamp区别,以及优缺点
    使用BitLocker实现磁盘加密、u盘加密、移动硬盘加密
    软件测试——功能性测试(1)
    春招面试准备笔记——NMS(非极大值抑制)算法
    手机如何将PDF文件拆分?分享两种手机拆分文件方法
    【SpringBoot】mockito+junit 单元测试
  • 原文地址:https://blog.csdn.net/baidu_41553551/article/details/125417596