C++进阶STL-标准输入输出 IO

基本概念

  • 从键盘到程序  标准输入 input
  • 从程序到显示器 标准输出 output

  • 标准输入+标准输出=标准I/O
  • 文件的输入和输出叫做文件I/O

标准输入输出流的对象

  • cerr : 没有缓冲区
  • clog 、cin、 cout :有缓冲区

cin

  • cin.get() :读取一个字符,返回值是字符,也可以传入形参,读完之后缓冲区就没有这个字符
  • cin.get(ch) : 读取一个字符给ch
  • cin.get(ch,10) : 读取10个字符(最后一个\0)给ch
	char ch[256];
	cin.get(ch,3);
	cout << ch << endl;
	cin.ignore(2);
	cin.get(ch,3);
	cout << ch << endl;

	输入 abcdefg
	输出 ab 
	     ef
  • cin.getline() : 读取一行的字符,默认遇到换行结束
char ch[10]; 
cin.get(ch, 5, '5');//遇到‘5’结束,5这个字符还在缓冲区,下次读取的是5
cout << ch << endl;

char c;
cin.get(c);
cout << c << endl;

输入 : 125678
输出 : 12
        5
------------------------------------------
char ch[10]; 
cin.getline(ch, 5, '5');// 5这个字符不在缓冲区,下次读取的是5后面的字符,将5忽略了
cout << ch << endl; 

char c;
cin.get(c);
cout << c << endl;	 

输入 : 125678
输出 : 12
        6
  • cin.ignore() : 忽略当前字符(从缓冲区取走了),形参表示忽略几个字符,默认一个。
	char ch;
	cin.get(ch);
	cout << ch << endl;
	cin.ignore();
	cin.get(ch);
	cout << ch << endl;

  输入 abc    
  输出 a
       c
  • cin.peek() : 返回缓冲区的第一个字符,但是还在缓冲区,就是看一下

  • cin.putback() : get()拿走了,putback再将它放回去。

        char ch;
	cin.get(ch);
	cin.putback(ch);
	
	int number;
	cin >> number;
	cout << "您输入的数字是:" << number << endl;
		 
		 
        结果:输入和输出一样	 

cout

  • cout.flush() : 手动刷新缓冲区
  • cout.put() : 向缓冲区输入一个字符
  • cout.write() :

格式化输出

5.格式化输出(通过成员)
	int number;
	cin >> number;

	cout.unsetf(ios::dec);//卸载当前的10进制输出
	cout.setf(ios::hex);//设置当前为16进制输出

	cout.setf(ios::showbase);//16进制前面显示0x   8进制前面显示0

	cout.width(6);    //设置6位宽
	cout.fill('*');   //以~来填充 空
	cout.setf(ios::left);//左对齐
	
	cout << number << endl;
	
	
	
6.格式化输出(通过控制符,需要包含头文件iomanip)
  	    cout << hex    //16进制输出
		 << setiosflags(ios::showbase)//16进制前面显示0x   8进制前面显示0
		 << setw(6)//设置6位宽
		 << setiosflags(ios::left)//左对齐
		 << setfill('*')//以*来填充 空
		 << number << endl;//



文本文件输入输出流 ifstream ofstream fstream

        const char* path1 = "C:\\Users\\VULCAN\\Desktop\\a.txt";
	const char* path2 = "C:\\Users\\VULCAN\\Desktop\\b.txt";

	ifstream ism(path1, ios::in);//文件输入流,in 读
	ofstream osm(path2, ios::out|ios::app);//文件输出流,out 写,app 追加的方式

	if (!ism)//内部有重载
	{
		cout << "打开文件失败" << endl;
	}

	char ch;
	while (ism.get(ch))
	{
		cout << ch;
		osm.put(ch);//写到 输出文件流
	}
	cout << endl;

	ism.close();//关闭输入文件
	osm.close();

文本模式、二进制模式

  • 在linux平台下进行文件读写时,文本模式和二进制模式没有区别
  • 在windows下,
    (文本模式):
      写文件将 换行\n 转化成 回车换行\r\n
      读文件将 将回车换行\r\n 转化成 换行\n
    (二进制模式)
      不进行转化

二进制方式读写文件

  • 将对象以二进制读取,保存-> 叫做对象序列化
	class Person
	{
	public:
		Person(int age, int name):m_age(age),m_name(name)	{	}
		Person()	{	}
		void show()
		{
			cout << m_age << " "<< m_name << endl;		
		}
		int m_age;
		int m_name;
	};



		Person p1(20, 10);
		Person p2;

		const char* path2 = "C:\\Users\\VULCAN\\Desktop\\b.txt";
		ofstream osm(path2, ios::out|ios::binary);//out写,binary二进制方式
		osm.write((char*)&p1, sizeof(Person));
		osm.close();



		ifstream ism(path2, ios::in | ios::binary);//读
		ism.read((char*)&p2,  sizeof(Person));
		p2.show();
		ism.close();

猜你喜欢

转载自blog.csdn.net/zzyczzyc/article/details/82932777