IO标准库类型和头文件
IO对象不可复制或赋值
条件状态
IO标准库管理一系列条件成员,用来标记IO对象是否处于可用状态,或者碰到了哪些错误。
IO标准库的条件状态 | 作用 |
---|---|
strm::iostate | 机器相关的整型名,由各个iostream类定义,用于定义条件状态 |
strm::badbit | iostate类型的值,用于指出破坏的流 |
strm::failbit | iostate类型的值,用于指出失败的IO操作 |
strm::eofbit | iostate类型的值,用于指出流已经到大文件结束符 |
s.eof() | 如果设置了流s的eofbit值,返回true |
s.fail() | 如果设置了流s的failbit值,返回true |
s.bad() | 如果设置了流s的badbit值,返回true |
s.good() | 如果流s处于有效状态,返回true |
s.clear() | 将流s中的所有状态值设置为有效状态 |
s.clear(flag) | 将流s中的某个指定条件状态设置为有效,flag的类型是strm::iostate |
s.setstate(flag) | 给流s添加指定条件,flag的类型是strm::iostate |
s.rdstate() | 返回流s的当前状态 |
- badbit 标志着系统级的故障,如无法恢复的读写错误。
- 如果是可恢复的错误,此时设置failbit标志,这种导致设置failbit的问题是可以修正的
- eofbit 是在遇到文件结束符设置的,此时同时设置了failbit
- clear和setstate操作用于改变条件成员的状态
文件流对象的使用
fstream
头文件提供了三种支持文件IO的类型
- ifstream 提供读文件的功能
- ofstream 提供些文件的功能
- fstream 提供读写同一个文件的功能
对象绑定文件
#include<fstream>
#include <iostream>
using namespace std;
int main() {
// 假设当前目录中有infile.txt 和 outfile.txt
// 要将文件和ifstream或ofstream对象连接起来
ifstream infile("infile.txt");
ofstream outfile("outfile.txt")
}
或者
ifstream infile;
ofstream outfile;
infile.open("infile.txt");
outfile.open("outfile.txt");
重新绑定
int main(){
ifstream infile;
ofstream outfile;
infile.open("infile.txt");
outfile.open("outfile.txt");
//重新捆绑
ifstream infile("infile.txt");
infile.close();
infile.open("next.txt");
}
清除文件流的状态
假设要读取多个文件,并进行操作。方法有二
1、将文件对象创建循环体内(while 或者 for)
这样的话,没循环一次便要产生一次对象
#include<fstream>
#include <iostream>
#include<vector>
#include<string>
using namespace std;
int main() {
// 有多个文件
vector<string> file_name = { "a", "b", "c","d" };
vector<string>::iterator it = file_name.begin();
while (it != file_name.end()) {
ifstream input(it->c_str());
if (!input) {
break;
}
/*
进行读取文件后的操作
*/
it++;
}
}
2、将文件对象建立在循环体外
如果不想重复多次建立流对象,可以将之定义在循环体外,但是这样必须要注意管理流的状态。如果遇到文件结束符或其他错误,将设置流的内部状态,以便以后不允许再对流做读写操作。关闭流不能改变流的内部状态。
读写失败后,对象的状态将会保持错误模式,直到执行clear操作重新恢复流的状态。
int main() {
// 有多个文件
vector<string> file_name = { "a", "b", "c","d" };
vector<string>::iterator it = file_name.begin();
//在此定义文件对象
ifstream input;
while (it != file_name.end()) {
ifstream input(it->c_str());
if (!input) {
break;
}
/*
进行读取文件后的操作
*/
it++;
input.close();
input.clear();
}
}
文件模式
文件模式 | 功能 |
---|---|
in | 打开文件进行读操作 |
out | 打开文件进行写操作 |
app | 在每次写之前找到文件尾 |
ate | 打开文件后将文件定位在文件尾 |
binary | 以二进制模式进行IO操作 |
默认时,与ifstream流对象进行关联的文件将以in模式打开。
与ofstream流对象进行关联的文件则以out模式打开,使文件可写。以out模式打开的文件将会清空;丢弃文件存储的所有数据