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

本文详细介绍了C++中的标准输入输出流(cin、cout)的使用方法,包括字符读取、格式化输出等,以及文件输入输出流(ifstream、ofstream、fstream)的基本操作和模式,特别关注了二进制文件的读写。

基本概念

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

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

标准IO的对象

  • 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() :

格式化输出

#include<iomanip>

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



3. cout << fixed << setprecision(0) <<<< endl; 
//cout<<fixed——指一般方式(浮点)输出,不采用科学计数法输出
//setprecision(n)——设置输出浮点数的精度,配合fixed设定,指的是小数位数,设置setprecision(0)即指输出不带小数位的int值


文件IO ifstream ofstream fstream

文件打开类型

Mode含义
ios::in读文件的方式打开
ios::out写文件的方式打开
ios::app追加的方式打开
ios::trunc覆盖原来的,从头开始
ios::binary以二进制的方式,序列化
ios::ate指针置于文件尾部,用时候 参考

不同类型之间可以用 | 连接


ifstream:读

  • 以空格读取
 ifstream fin("./xx.txt");

    if(!fin)
    {
        cout << "error" << endl;
    }

    int data[100] ={0};
    int i=0;

    while(!fin.eof())
    {
        fin >> data[i];
        i++;
    }

    fin.close();
  • 以行读取
    ifstream fin("./xx.txt");

    if(!fin)   
        cout << "error" << endl;
    

    string name;
    while(!fin.eof())
    {
        getline(fin,name);
        cout << name << endl;
    }

    fin.close();
  • 常用的函数:

fin.get()



ofstream:写


  • 常用的函数:

fout.put()
fout.write()
fout.flush()


fstream:读写


  • 常用的函数:

在这里插入代码片



二进制方式读写文件

首先明白的概念:文本模式二进制模式

  • 在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();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值