IO流
设备:1、文件
2、控制台
3、特点的数据类型(stringstream)
C++中必须通过已定义好的类来处理IO(输入和输出)
1、文件流
文件流:对文件的输入输出
头文件:fstream
类库: istream:对文件的输入(读文件)
ostream:对文件的输出(写文件)
fstream:对文件的输入输出
2、对文件的读写
文件的打开方式:
模式标志 | 描述 |
---|---|
ios::in | 读方式打开文件 |
ios:out | 写方式打开文件 |
ios::trunc | 如果此文件已经存在, 就会打开文件之前把文件长度截断为0 |
ios::app | 尾部最加方式(在尾部写入) |
ios::ate | 文件打开后, 定位到文件尾 |
ios::binary | 二进制方式(默认是文本方式) |
以上打开方式, 可以使用位操作 | 组合起来
3、文件简单操作
,open | 打开文件 |
---|---|
.close | 关闭文件 |
.eof() | 判断是否结束 |
.open(ios::binary) | 打开二进制文件 |
.write((char*)&age, sizeof(age))–(假如输入年龄) | 写二进制文件 |
.read((char*)&age, sizeof(age)) | 读二进制文件 |
.is_open( ) | 文件流是否打开成功 |
.fail( ) | 流的failbit或者badbit被置位时, 返回tru |
failbit | 出现非致命错误,可挽回, 一般是软件错误 |
badbit | 出现致命错误, 一般是硬件错误或系统底层错误, 不可挽回 |
.bad( ) | badbit置位时, 返回true |
.good( ) | 处于有效状态时, 返回true |
.clear( ) | 所有状态都被复位 |
4、格式流输入输出文件
写文件:
ofstream outfile;
stringstream s;
s << "name:" << name << "age:" << age << endl;
outfile << s.str();
读文件:
string line;
ifstream infile;
getline(infile, line);//读一行
sscanf_s(line.c_str(), "name:%s age:%d", name, sizeof(name),&age);//用C语言方式,必须与写文件格式一直,否则出现异常
cout << "name:" << name << "age:" << age << endl;
5、文件流定位
1、seekg
seekg( off_type offset, //偏移量
ios::seekdir origin ); //起始位置
作用:设置输入流的位置
参数1: 偏移量
参数2: 相对位置
beg 相对于开始位置
cur 相对于当前位置
end 相对于结束位置
infile.seekg(-50, infile.end);//从最后读50个
2、tellg
返回该输入流的当前位置(距离文件的起始位置的偏移量)
// 先把文件指针移动到文件尾
infile.seekg(0, infile.end);
3、seekp
设置该输出流的位置
outfile.seekp(4, outfile.beg);
6、小计
count常常取:
std::numeric_limitsstd::streamsize::max() 相当于IO流的最大字符个数
常见用法:(把标准输入缓冲区cin的所有数据都清空)
cin.ignore(std::numeric_limits::max(), ‘\n’);
// 如果输入错误, 需要反复重复输入
while (cin.fail()) {
cin.clear(); //清除错误标志
//cin.sync(); 在vs中无效
// 把cin的输入缓冲区中的数据全部清除,直到遇到回车符
cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
cout << "输入错误,请重新输入:";
cin >> num;
}