流:若干字节数据从一端到另一端
流操作: 流对象加上流运算符(左移右移)
流类体系(包含以下三种的一个类)
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 文件当前位置