流概述
流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序员就可以使用它,流将负责处理所有的细节。
IO类库
在C++输入?输出操作是通过C++系统提供的完成I/O操作的一组类实现的。主要包括:
标准流类:处理与标准输入设备(键盘)和输出设备(显示器)关联的数据流
文件流类:处理与磁盘文件关联的数据流
字符串流类:利用内存中的字符数组处理数据的输入输出
异常类等:处理异常错误.
标准IO对象:
包含iostream类的C++程序启动时,将创建并初始化4个对象。
1、cin :处理来自标准输入的设备(键盘)的输入。
2、cout:处理到标准输出设备(控制台屏幕)的输出
3、cerr: 处理到标准错误设备(控制台屏幕)的非缓冲输出,由于这是非缓冲的,所以发送到cerr的任何数据都被立即写入标准错误设备,而不等缓冲区填满或者刷新指令
4、clog:处理输出到标准错误设备(控制台屏幕)的缓冲错误信息。
注意:cin 在遇到空格或者换行符时标示输入结束。
/*File : cerr.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/
#include <iostream>
using namespace std;
/*格式化输出
*输出缓冲遇到换行,有输入、满、程序结果、flush会刷新
*/
int main()
{
char ch;
cerr << "World "; /*无缓冲,不可重定向*/
cin >> ch;
clog << "Clog "; /*理论上“缓冲,不可重定向”实际上无缓冲*/
cout << "Hello "; /*缓冲,可重定向*/
//输入任意字符退出
cin >> ch;
return 0;
}
看输出:
问题:从上面的输出结果,貌似cout也不是带缓冲的,不知道是我理解的问题,还是代码写的有错误,求解?
下面是一些基本函数的用法
/*File : get.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/
#include <iostream>
using namespace std;
int main()
{
char ch;
while((ch = cin.get()) != EOF ){
if (ch == ‘$‘){
break;
}
cout <<"ch = " << ch << endl;
}
cout << "Done" << endl;
cin.ignore(10,‘\n‘);
char s[25];
cin.get(s,25);
cout << s << endl;
return 0;
}
输出结果:
/*File : cerr.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/
#include <iostream>
#include <string>
using namespace std;
/*i.get() 从键盘输入一个字符
*o.put() 往屏幕输出一个字符
*i.getline() 从键盘输入一串字符串
*i.putback() 插入字符。
*i.peek() //查看输入缓冲区的第一个字符
*/
void get_put()
{
cout << "####请输入四个字符或者数字###" << endl;
int n = cin.get();
char c,d,e;
cin.get(c).get(d).get(e);// istream& get(char& ch);
cout << "n = " <<n << endl;
cout << "c = " <<c << endl;
cout << "d = " <<d << endl;
cout << "e = " <<e << endl;
cout << "另一种输出方法" <<endl;
cout.put(n).put(c).put(d).put(e);
//忽略前200个字符除非遇到字符‘\n‘,而停止忽略字符
cin.ignore(200,‘\n‘);
char ch;
cin >> ch;
cout << "ch = " <<ch << endl;
cin.ignore(200,‘\n‘);
}
void mygetline()
{
char buf[10]={‘\0‘};
cout << "####start getline ###" <<endl;
cout << "cin.getline 输入字符串,长度不要超过9个,‘\0‘ 10个" <<endl;
cin.clear();
if(!cin.getline(buf,sizeof(buf))){
cout << "行输入过长,错误" <<endl;
cin.clear();
/*清除输入过长的部分,应该不会超过1000个吧!*/
cin.ignore(1000,‘\n‘);
}
string s;
cout << "使用getline 全局函数输入字符串:" <<endl;
getline(cin,s);//getline(cin,s,‘s‘)
cout << "buf = " << buf<<endl;
cout << "s = " << s << endl;
cout << "printf 输出s :" <<endl;
printf("%s\n",s.c_str());
cout << "####end getline ###" <<endl;
}
void mypeek()
{
char buf[10];
char c;
cout << "请输入一个字符," << endl;
cin >>ws;//屏蔽掉空格
c = cin.get();
cin.putback(c);
if(cin.peek()> ‘0‘ && cin.peek() < ‘9‘){
double d;
cout <<"请输入一个浮点数" << endl;
cin >> d;
cout << "d = " << d << endl;
}else{
string s;
cout <<"请输入一串字符串" << endl;
cin >> s ;
cout <<"s = " << s << endl;
}
}
int main2()
{
//get_put();
//mygetline();
//mypeek();
return 0;
}
文件的输入和输出:
下面介绍打开和关闭文件的流对象, ifstream ofstream
/*File : cerr.cpp *Auth : sjin *Date : 20140506 *Mail : 413977243@qq.com */ #include <iostream> using namespace std; /*格式化输出 *输出缓冲遇到换行,有输入、满、程序结果、flush会刷新 */ int main() { char ch; cerr << "World "; /*无缓冲,不可重定向*/ cin >> ch; clog << "Clog "; /*理论上“缓冲,不可重定向”实际上无缓冲*/ cout << "Hello "; /*缓冲,可重定向*/ //输入任意字符退出 cin >> ch; return 0; }
看输出:
/*File : get.cpp *Auth : sjin *Date : 20140506 *Mail : 413977243@qq.com */ #include <iostream> using namespace std; int main() { char ch; while((ch = cin.get()) != EOF ){ if (ch == ‘$‘){ break; } cout <<"ch = " << ch << endl; } cout << "Done" << endl; cin.ignore(10,‘\n‘); char s[25]; cin.get(s,25); cout << s << endl; return 0; }
输出结果:
/*File : cerr.cpp *Auth : sjin *Date : 20140506 *Mail : 413977243@qq.com */ #include <iostream> #include <string> using namespace std; /*i.get() 从键盘输入一个字符 *o.put() 往屏幕输出一个字符 *i.getline() 从键盘输入一串字符串 *i.putback() 插入字符。 *i.peek() //查看输入缓冲区的第一个字符 */ void get_put() { cout << "####请输入四个字符或者数字###" << endl; int n = cin.get(); char c,d,e; cin.get(c).get(d).get(e);// istream& get(char& ch); cout << "n = " <<n << endl; cout << "c = " <<c << endl; cout << "d = " <<d << endl; cout << "e = " <<e << endl; cout << "另一种输出方法" <<endl; cout.put(n).put(c).put(d).put(e); //忽略前200个字符除非遇到字符‘\n‘,而停止忽略字符 cin.ignore(200,‘\n‘); char ch; cin >> ch; cout << "ch = " <<ch << endl; cin.ignore(200,‘\n‘); } void mygetline() { char buf[10]={‘\0‘}; cout << "####start getline ###" <<endl; cout << "cin.getline 输入字符串,长度不要超过9个,‘\0‘ 10个" <<endl; cin.clear(); if(!cin.getline(buf,sizeof(buf))){ cout << "行输入过长,错误" <<endl; cin.clear(); /*清除输入过长的部分,应该不会超过1000个吧!*/ cin.ignore(1000,‘\n‘); } string s; cout << "使用getline 全局函数输入字符串:" <<endl; getline(cin,s);//getline(cin,s,‘s‘) cout << "buf = " << buf<<endl; cout << "s = " << s << endl; cout << "printf 输出s :" <<endl; printf("%s\n",s.c_str()); cout << "####end getline ###" <<endl; } void mypeek() { char buf[10]; char c; cout << "请输入一个字符," << endl; cin >>ws;//屏蔽掉空格 c = cin.get(); cin.putback(c); if(cin.peek()> ‘0‘ && cin.peek() < ‘9‘){ double d; cout <<"请输入一个浮点数" << endl; cin >> d; cout << "d = " << d << endl; }else{ string s; cout <<"请输入一串字符串" << endl; cin >> s ; cout <<"s = " << s << endl; } } int main2() { //get_put(); //mygetline(); //mypeek(); return 0; }
文件的输入和输出:
参考资料: