C++的几种输出
cout 有缓冲、可重定向
cerr 无缓冲、不可重定向
clog 无缓冲、不可重定向(理论上是有缓冲的)
输出刷新
输出缓冲遇到换行、有输入、满、程序结束、flush会刷新
几个输入输出函数
o.put() 原样输出,含空白字符
i.get() 原样输入,含空白字符
i.getline() 正行输入
i.ignore() 清除缓存区
i.clear() 清除错误
i.putback() 退回
i.peek() 获取下一个字符,但是不移动指针
#include <iostream>
using namespace std;
/*
写个总结,区分
int get()
getchar()
istream& get(char& ch)
cin.get(char& ch)
cin >> ch
scanf(" %c", ch);
*/
int main(){
//如果成功返回该字符的ascII码,否则返回EOF(-1)
//int get()
//类似于 getchar()
int n = cin.get();
char c,d,e;
//istream& get(char& ch)
//他会读取所有字符,包含空白字符
cin.get(c).get(d).get(e);
//原样输出
cout << n << " " << c << " " << d << " " << e << endl;
//输出原本的内容
cout.put(n).put(c).put(d).put(e);
//从输入缓冲区获取并忽略一些字符
//第一个参数:忽略字符数
//第二个参数:一直忽略字符,直至当前输入字符
cin.ignore(200, '\n');
//类似于scanf(" %c", ch);
//它会读取所有字符,但会跳过空白字符
char ch;
cin >> ch;
getchar();
return 0;
}
读取错误状态的处理
清楚错误与清楚缓存区
#include <iostream>
#include <string>
using namespace std;
/*
在C++中要求io对象能够转成bool类型。
对正常的io对象专称true,对处于错误状态的io对象转成false。
下面的输出地址没有具体实际意义,只是当做bool类型运算使用
*/
int main(){
cout << cout << endl;
cout << cin << endl;
// cout << &cout << endl;
// cout << &cin << endl;
int n;
cin >> n;
//分别输入 232 kdk,返回值为 地址 0
//因此可以用 cin 的返回值来判定输入状态
cout << cin << endl;
//但是需要注意,io一旦处于错误状态就拒绝读写
//输入 3232ksdlskd 数字部分分配给 n,其余部分分配给字符串并在下面输出
//输入 sdksldks 数字部分错误,则下面无法再继续写入,输出空
//可以增加 cin.clear()清除上面的错误状态,则下面的io可以继续工作
string s;
//注意,clear不清除缓冲区,只清除错误状态
//cin.ignore() 来清除缓冲区
cin.clear();
cin >> s;
cout << "s " << s << endl;
getchar();
return 0;
}
控制台 IO
#include <iostream>
#include <string>
using namespace std;
/*
i对象 = cin等
i对象.getline(char数组,数组大小);
注意:如果没有成功读取一整行,则会尽量读取前部分,
然后将io置于错误状态,后面拒绝继续io操作
getline(i对象,string对象引用, 读到哪个字符为止(可省略,默认换行符))
i对象.putback(字符);回退
i对象.peek()偷看下一个字符
*/
int main(){
cin >> ws;//跳过空白字符
char c = cin.get();
cin.putback(c); //退回
if (cin.peek()>='0'&&cin.peek()<='9') { //等价于isdigit(c)
cout << "数字" << endl;
double n;
cin >> n;
cout << n;
}else{
cout << "字符串" << endl;
string n;
cin >> n;
cout << n;
}
getchar();
return 0;
}
字符串IO
#include <iostream>
#include <string>
#include <sstream>//字符串流
using namespace std;
int main(){
string s = "12345 6.7 x hello";
int a;
double d;
char c;
string ss;
//从字符串读取
istringstream is(s);
is >> a >> d >> c >> ss;
cout << a << endl;
cout << d << endl;
cout << c << endl;
cout << ss << endl;
//写入到字符串
ostringstream os;
os << a << d << c << ss ;
os.str(); //从字符串中获取数据
os.str()[5]; //获取第六个字符
getchar();
return 0;
}
文件IO
#include <iostream>
#include <string>
#include <fstream>//文件流
using namespace std;
int main(){
string path = "kak.txt";
ifstream fin(path.c_str());
/*
等价于
ifstream fin;
fin.open(path.c_str());
*/
if(!fin){
cout << "打开失败" << endl;
return 1;
}
char c;
fin.get(c);//原样读取
fin >> c; //跳过空白字符读取
fin.close();
getchar();
return 0;
}