流:若干字节数据从一端到另一端
流操作: 流对象加上流运算符(左移右移)
流类体系(包含以下三种的一个类)
1 输出输出流
1.1 ostream 类 cout cerr clog(日志)
cour 标准输出 可重定向
cerr 标准错误输出 不能重定向
clog 标准错误输出 重定向为文件
重定向:把输入输出定向为 文件,例如C语言 freopen()
1.2 istream 类 cin
#include <iostream> #include <cstdio> #include <iomanip> using namespace std; void testostream() //output { //freopen() cout << "标准输出" << endl; //重定向 cerr << "标准错误输出" << endl; //不能重定向 clog << "标准错误输出" << endl; //重定向为文件 //字符类的处理 //输出字符 cout.put('a'); cout << 'a' << endl; char c = 'C'; cout.put(c); cout << c << endl; //输出字符串 cout.write("adidadaqikounowan",10); //指定长度,超过长度不做输出 cout << endl; //cout.write("adidadaqikounowan", 120); //指定长度,超过长度不做输出 cout << endl; //输入 //c=cin.get(); cout.put(cin.get()); //字符串 while (cin.get() != '\n'); //while(getchar()!='\n'); char str[20] = ""; cin.getline(str, 20);// 不能处理string类型 cout.write(str, 20); } void testiomanip() { //格式控制 //设置格式 double pi = 34.12343; cout << "设置有效位数是:" << setprecision(4) << pi << endl; //小数位需要结合fixed cout << "有效小数位:" << fixed << setprecision(4) << pi << endl; //cout.precision(4); 所有的流控制符都会对应一个成员函数的方式 //进制输出 cout << hex << 32 << endl; //十六进制 cout << oct << 15 << endl; //8进制输出 //可以设置某些进制 8 -10-16进制 cout << setbase(10) << 15 << endl; //8-16 //默认右对齐 //cout.with(8); // 取消格式对齐方式 //cout << resetiosflags << endl; //对齐方式 左对齐 右对齐 cout << setiosflags(ios::left); //ios::right //设置输出宽度 cout << setw(8) << "123" << setw(8) << "12344" << setw(8) << "3444" << endl; cout << setw(8) << "123" << setw(8) << "12344" << setw(8) << "3444" << endl; } int main() { //testostream(); testiomanip(); return 0; }
2字符流
用的头文件是 sstream类 (父类)
istringstream(子类)
ostringstream(子类)
一般用sstream类对象即可
获取字符流对象中的数据
string str() //获取string
void str(const string &str); //重新设置字符流对象的数据
一般用于字符串的分割和转换
#include <iostream> #include <sstream> #include <cstdio> using namespace std; //23,132,3443,54,54,65 void teststringstream() { //构建字符流对象 ,以及获取字符流对象中数据 stringstream sso(string("ILoveyou")); cout << sso.str() << endl; //无参构造 stringstream ssnull; ssnull << "我爱你!"; cout << ssnull.str() << endl; //错误 没有赋值这种操作 //stringstream ss = string("IMissyou"); string data; ssnull >> data; cout << data << endl; ssnull.str("ILoveyou"); //ssnull.clear(); cout << ssnull.str() << endl; //字符串与数字之间转换 int num = 1234; char input[20] = ""; stringstream transs(input); transs << num; transs >> input; cout << input << endl; stringstream snum("12345"); int temp = 0; snum >> temp; cout << temp << endl; //分割 stringstream sData("23,132,3443,54,54,65"); int numData[6]; char cData[5]; for (int i = 0; i < 6; i++) { if (i == 5) sData >> numData[i]; else sData >> numData[i] >> cData[i]; } for (int i = 0; i < 6; i++) { cout << numData[i] << " "; } cout << endl; //多次同一个流做数据转换操作,一定做clear操作 transs.clear(); transs << num; transs >> input; cout << input << endl; } int main() { teststringstream(); //char str[20] = ""; //int num; //scanf_s("%d%s", &num, str,20); //cout << num << " " << str << endl; return 0; }
3 文件流
流类体系
ofstream 类 写操作 output输出到文件
ifstream 类 读操作
fstream 类 可读可写 用的时候包含头文件#include<fsrream>
打开关闭文件
打开文件 void open(const char* URL,ios::openmode mode);
读写方法
ios::in 读的方式打开文件
ios::out 写的方式打开文件 具有创建功能
ios::app 追加模式 具有创建功能
ios: ate 追加模式 文件指针指向末尾
ios::trunc 具备创建功能
ios:: noreplacr 不替换(C语言 w)
ios:: nocreate 不创建
ios::binary 二进制方式
读写的组合方式用的是
可读可写可创建 ios::in||ios::out||ios::trunc
二进制可读可写可创建 ios::bianry||ios::in||ios::out
判断文件是否打开成功
用文件流对象重载的运算
is_open() 成员函数判断
返回true 打开成功
返回false 打开失败
关闭文件 void close();
读写文件
流的方式读写
二进制方式读写
把string写到文件 需要先转换为char*
文件指针定位
ifstream 类的对象
istream& seekg(long int pos,ios_base::seekdir position);
ofstream 类的对象
ostream& seekg(long int pos,ios_base::seekdir position);
ios_base::seekdir
ios::beg 文件开始位置
ios::end 文件结束位置
ios:: cur 文件当前位置