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

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

一、标准输入输出流

STL教程4-输入输出流和对象序列化_第1张图片
cout是全局对象,已经和显示屏关联
STL教程4-输入输出流和对象序列化_第2张图片
cerr没有缓冲区,clog有缓冲区,cin和cout也有缓冲区

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

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

格式化输出

1、成员方法的方式
STL教程4-输入输出流和对象序列化_第3张图片
代码

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;

}

2、通过控制符
需要包含头文件#include
STL教程4-输入输出流和对象序列化_第4张图片

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

二、文件操作

文件读取

需要包含头文件#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();

文件写入

定义文件写入对象和定义文件读取格式一样
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();


}

二进制模式读写

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

STL教程4-输入输出流和对象序列化_第5张图片
STL教程4-输入输出流和对象序列化_第6张图片
STL教程4-输入输出流和对象序列化_第7张图片
STL教程4-输入输出流和对象序列化_第8张图片

总结

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

你可能感兴趣的:(C/C++,c++,开发语言)