c++学习 I/O
输入还是输出,是相对于程序而言的。
标准I/O
标准输入:从键盘输入进程序。
标准输出:从程序输出到显示器/控制台。
注: 我们常用的cout(标准输出)、cin(标准输入)等,并不是关键字,而是全局流对象。另有cerr(标准错误(输出))和clog(标准日志(输出)),其中cerr没有缓冲区,而clog有。
缓冲区
缓冲区是一块内存空间。
以cin为例,缓冲区可以看作程序与键盘之间的桥梁。cin首先从缓冲区里读数据,若缓冲区无数据可用,则阻塞,等待键盘向缓冲区输入数据。
cout<<"hello"; //写入缓冲区
cout<<"hello"<<endl; //输出到显示器
标准输入流cin
cin.get()
从缓冲区得到一个字符并返回。
用例:
char ch;
cin.get(ch); //读一个字符到ch
char buf[256];
cin.get(buf,256); //读一个字符串到buf
cin.getline()
读取一行。
用例:
char buf[256];
cin.get(buf,256); //读一行数据到buf(不读换行)
cin.ignore()
忽略(取走但不使用)接下来的字符。
用例:
cout << (char)cin.get() << endl;
cin.ignore(); //忽略接下来的一个字符。
cout << (char)cin.get() << endl;
若输入asd,则输出ad
cin.ignore(10); //忽略接下来的10个字符。
cin.ignore(10,'\n'); //忽略至多10个字符,直到遇到'\n'。
cin.peek()
查看(不取走)缓冲区接下来的字符,并返回。
用例:
cin.peek();
cin.putback()
将字符放回缓冲区。
用例:
char ch;
cin.get(ch);
cin.putback(ch);
标准输出流cout
cout.flush()
刷新缓冲区,将内容显示出来。
用例:
cout<<"hello"; //没有endl不会显示到控制台
cout.flush(); //手动刷新以显示缓冲区
cout.put()
输出一个字符。
用例:
cout.put('h').put('i')<<endl;
输出hi
cout.write()
输出字符串。
用例:
cout.write("hello", strlen("hello"));
格式化输出
方法1、设置输出方式
int number = 10;
cout << number << endl;
cout.unsetf(ios::dec);//卸载当前默认的的10进制输出方式
cout.setf(ios::oct); //设置为八进制输出
cout.setf(ios::showbase);//输出时附带八进制前置的0或十六进制前置的0x
cout.width(10);//设置位宽
cout.fill('*');//用字符填充
cout.setf(ios::left);//默认是右对齐,现在设置为左对齐
cout << number << endl;
输出10和012。
方法2、使用输出格式控制符
要包含头文件<iomanip>
,具体本文不再介绍。
文件操作
包含一个<fstream>
就好。
创建两个流对象,一个输入一个输出。
以输入流为例
ifstream ism(filename,ios::in);//以只读方式打卡文件
上述为有参构造方式,也可以:
ifstream ism;
ism.open(filename,ios::in);
判断文件是否打开成功:
if(!ism){ // !在类中默认被重载过,可以直接使用
cout<<"open failed"<<endl;
return;
}
关闭文件:
ism.close();
文件打开方式
ios::in 输入
ios::out 输出
ios::in|ios::out 输入输出都可
ios::app 追加
ios::binary 二进制
二进制文件操作
使用关键字write和read进行二进制读写:
osm.write((char*)&myclass,sizeof(myclass)); //将myclass以二进制写入
ism.read((char*)&other,sizeof(myclass)); //以二进制读入一个myclass到other
其他知识点
1、文件以EOF结尾,EOF在键盘上就是CTRL+z。
2、在windows系统中,文件中的换行为\r和\n,也就是说你写一个换行,文件中就保存了’\r’、’\n’两个字符。