前言
C++语言不直接处理输入输出,而是通过标准库中的类型处理IO。这些类型支持从设备读取数据、向设备写入数据的IO操作,设备可以是文件、控制台窗口等。还有一些类允许内存IO,即,从string读取数据,向string写入数据。
IO类
iostream | istream, ostream |
fstream | ifstream, ofstream |
sstream | istringstream, ostringstream |
IO对象无拷贝或赋值
流的条件
strm::iostate | iostate是一种机器相关的类型 |
strm::badbit | 指出流已崩溃 |
strm::failbit | 指出一个IO操作失败了 |
strm::eofbit | 流达到了文件结束 |
strm::goodbit | 流未处于错误状态 |
s.eof() | 若流s的eofbit置位,则返回true |
s.fail() 用它 | 若流s的failbit或badbit置位,则返回true |
s.bad() | 若流s的badbit置位,则返回true |
s.good() 用它 | 若流s处于有效位,则返回true |
s.clear() | 将流复位返回void |
s.clear(flags) | 根据flags复位 |
s.setstate(flags) | |
s.rdstate() | 返回流当前状态 |
auto old_state = cin.rdstate(); // 记住cin的当前状态
cin.clear(); // 使cin有效
process_input(cin); // 使用cin
cin.setstate(old_state); // 将cin置为原有状态
缓冲区操作
endl | flush | ends | unitbuf | nounitbuf |
文件输入输出
fstream特有操作 | |
---|---|
fstream fstrm; | |
fstream fstrm(s); | |
fstream fstrm(s, mod) | |
fstrm.open(s) | |
fstream.close() | |
fstream.is_pen() | |
fstream 具有和 iostream类一样的特性,即,可以把fsteam当iostream用 |
std::ifstream in(filename); // 创建一个ifstream对象,并自动调用.open打开filename
std::ofstream out; // 创建一个ofstream对象
out.open(filename);
if (out){
//如果out成功打开,则做一些事情
}
in.close(); // 此时if (in)条件位false
当fstream对象离开其作用域时,与之关联的对象会自动关闭
保险起见,养成 .close() 的习惯?
文件模式
// 同Python open
std::ofstream out;
out.open(file, std::ofstream::app); //追加模式
string流
sstream strm; | |
sstream strm(s); | |
strm.str() | |
strm.str(s) |
struct PersonInfo{
string name;
vector<string> phone;
};
"istringstream在while内部:"
int main(){
string line, word;
vector<PersonInfo> peos;
while (getline(cin, line)){
std::istringstream isstrm(line);
PersonInfo men;
isstrm >> men.name;
while (isstrm >> word){
men.phone.push_back(word);
}
peos.push_back(men);
}
cout << "Input ended, Nowing output:\n";
for (auto person: peos){
cout << " print:" << endl;
cout << person.name << endl;
}
return 0;}
"istringstream在while外部:"
std::istringstream isstrm;
string line, word;
vector<PersonInfo> peos;
while (getline(cin, line)){
PersonInfo men;
isstrm.clear(); // 必须复位isstrm流,使其处于有效的状态
isstrm.str(line);
isstrm >> men.name;
while (isstrm >> word){ // 检查流是否有效
men.phone.push_back(word);
}
// 流处于无效的状态
cout << "push_back" << endl;
peos.push_back(men);
}
小结
- iostream处理控制台IO
- fstream处理文件IO
- sstream完成内存string的IO
fstream和sstream都继承自类iostream。
当流的状态为有效时才能够进行正常的IO操作。
输入与输出都是站在内存的角度来看待的
ifstream打开文件后将其数据输入到内存,所以是读文件操作
ofstream打开文件后,将内存中的数据输出到文件,所以是写文件