IO类
1.应用以及相应头文件
- 操纵char字符
- 读写命名文件
- 处理string类型
- 宽字符语言使用,定义一组类型和对象操纵wchar_t,相比与char型,类型定义前缀里加了w。比如wcin、wcout等。
相应IO库头文件和类型如下:
头文件 | 类型 |
---|
iostream | istream,wistream 从流中读数据 |
| ostream,wostream 从流中写数据 |
| iostream,wiostream 读写流 |
fstream | ifstream,wifstream 从文件中读数据 |
| ofstream,wofstream 从文件中写数据 |
| fstream,wfstream 读写文件 |
sstream | istringstream,wistringstream 从string中读数据 |
| ostringstream,wostringstream 从string中写数据 |
| stringstream,wstringstream 读写string |
2.类型之间关系
设备类型和字符大小不会影响我们要执行的IO操作,这些操作的操作方法一致。能忽略不同流类型之间差异的原因是继承机制。
3.IO对象公共操作
IO对象不能拷贝赋值
- 不能拷贝赋值,不能作为形参或返回类型。
- 可以通过引用方式传递或者返回流,引用不能是const类型。
访问和操纵流的条件状态
状态类型
其中strm是一种IO类型。
类型 | 说明 |
---|
strm::iostate | 提供表达流状态完整功能,作为一个位集合使用。 |
strm::badbit | 流已崩溃,发生系统级错误,流无法被使用,badbit置位时failbit也会置位 |
strm::failbit | 一个IO操作失败,可恢复错误 |
strm::eofbit | 流达到文件结束,eofbit和failbit同时置位 |
strm::goodbit | 流未处于错误状态,此值一直为零 |
流状态查询函数
函数 | 说明 |
---|
s.bad() | badbit置位,返回true |
s.fail() | failbit置位,返回true |
s.eof() | eofbit置位,返回true |
s.good() | s有效状态,返回true,所有错误均未置位 |
s.rdstate() | 返回当前状态条件,返回值类型strm::iostate |
while(cin>>word){}
if(!cin.fail()){}
if(cin.good()){}
管理状态函数
函数 | 说明 |
---|
s.clear() | 所有条件状态位复位 |
s.clear(flags) | 流中对应条件位复位 |
s.rdstate() | 返回当前状态条件 |
管理输出缓冲
输出缓冲
- 每个输出流关联一个缓冲区,保存程序读写数据,程序正常结束,return操作结束时缓冲刷新会被执行。如果程序崩溃,缓冲区不会被刷新,数据可能会停留在输出缓冲区。
- 当缓冲区满,需要刷新缓冲;
刷新缓冲方式
cout << 1 << endl;
cout << 1 << flush;
cout << 1 << ends;
cout<<unitbuf;
cout<<noununitbuf;
cerr<<1;
- 关联输出流与另一个流
当一个流与输出流关联在一起。以输入流为例,从输入流读取数据的操作会刷新关联的输出流。标准库将cin和cerr与cout关联在一起,读cin或者写cerr都会导致cout缓冲区刷新。
cin>>ival;
通过tie可以将一个流与输出流进行关联,tie有两个版本,一个返回指向输出流的指针,一个接收指向输出流的指针,指针可以为空(nullptr)。
cout << &cout << endl;
cout << cin.tie() << endl;
ostream* oldtie = cin.tie(nullptr);
cout << oldtie<< endl;
cout << cin.tie() << endl;
cin.tie(&cerr);
cout << cin.tie() << endl;
cin.tie(oldtie);
cout << cin.tie() << endl;
文件输入输出
文件类型
头文件 | 类型 |
---|
fstream | ifstream,wifstream 从文件中读数据 |
| ofstream,wofstream 从文件中写数据 |
| fstream,wfstream 读写文件 |
文件操作
| 函数及类型 | 含义 |
---|
构造 | fstream fstrm; | 创建未绑定文件流 |
| fstream fstrm(s); | 创建文件流并打开 |
| fstream fstrm(s,mode); | 按指定模式打开文件 |
打开 | fstrm.open(s); | 打开文件并与fstrm绑定,返回void。 |
关闭 | fstrm.close() | 关闭与fstrm绑定的文件,返回void。 |
是否打开成功 | fstrm.is_open() | 返回bool值,检查文件是否打开并且尚未关闭 |
class hhdy {
public:
friend istream& read(istream& is, hhdy& hh);
friend ostream& print(ostream& os, hhdy& hh);
private:
char h1[10];
char h2[10];
};
istream& read(istream& is, hhdy& hh) {
is >>hh.h1 >> hh.h2;
return is;
}
ostream& print(ostream& os, hhdy& hh) {
os << hh.h1<<endl;
os << hh.h2 << endl;
return os;
}
int main( ) {
vector<string> argv(4);
argv[0] = "F:\\c++\\Project1\\IO类\\1.txt";
argv[1] = "F:\\c++\\Project1\\IO类\\2.txt";
argv[2] = "F:\\c++\\Project1\\IO类\\3.txt";
argv[3] = "F:\\c++\\Project1\\IO类\\4.txt";
ifstream wfile(argv[0]);
hhdy hh;
read(wfile, hh);
wfile.close();
for (int i = 1; i < 4; ++i) {
ofstream rfile(argv[i]);
if (rfile.good()) {
cout << "open the file[" << i << "] successful"<<endl;
print(rfile, hh);
}
else {
cerr << "Can't open the file!" << endl;
}
}
return 0;
}
文件模式
文件模式 | 含义 |
---|
in | 以读方式打开,ifstream、fstream |
out | 以写方式打开,ofstream,fstream |
app | 写操作前定位到文件末尾,trunc没被设定时可以设定app模式。app模式下,文件总是以输出方式被打开 |
ate | 打开操作后立即定位到文件末尾,不限制文件流类型和文件模式 |
trunc | 截断文件,截断即清空文件内容重新输入,out被设定时trunc才能被设定,out默认为trunc模式 |
binary | 以二进制方式进行IO,不限制文件流类型和文件模式 |
int main() {
string s;
vector<string> argv(4);
argv[0] = "F:\\c++\\Project1\\IO类\\1.txt";
argv[1] = "F:\\c++\\Project1\\IO类\\2.txt";
argv[2] = "F:\\c++\\Project1\\IO类\\3.txt";
argv[3] = "F:\\c++\\Project1\\IO类\\4.txt";
fstream wfile(argv[0]);
wfile << argv[0];
wfile.close();
wfile.open(argv[0], ofstream::in);
wfile >> s;
wfile.close();
wfile.open(argv[1],ofstream::out);
wfile << s;
wfile.close();
wfile.open(argv[2], ofstream::out|ofstream::trunc);
wfile << s;
wfile.close();
wfile.open(argv[3], ofstream::app);
wfile <<'\n';
wfile << s;
wfile.close();
wfile.open(argv[3], ofstream::out|ofstream::ate);
wfile << '\n';
wfile << s;
wfile.close();
wfile.open(argv[3], ofstream::ate);
wfile << '\n';
wfile << s;
wfile.close();
wfile.open(argv[3], ofstream::out | ofstream::binary);
wfile << '\n';
wfile << s;
wfile.close();
return 0;
}
string流
头文件 | 类型 |
---|
sstream | istringstream,wistringstream 从string中读数据 |
| ostringstream,wostringstream 从string中写数据 |
| stringstream,wstringstream 读写string |
string流操作
| 函数及类型 | 含义 |
---|
构造 | sstream fstrm; | 创建未绑定string流 |
| sstream fstrm(s); | 创建string流并绑定s |
返回 | fstrm.str(); | 返回strm保存的string拷贝 |
拷贝 | fstrm.str(s) | 将s拷贝到strm中,返回void。 |
bool valid(const string &num) {
for (const auto s : num) {
if(!isdigit(s))
{
return false;
}
}
return true;
}
struct PersonInfo {
string name;
vector<string> phones;
};
int main() {
string line, word;
vector<PersonInfo> people;
while (getline(cin, line)) {
PersonInfo info;
istringstream record(line);
record >> info.name;
while (record >> word)
info.phones.push_back(word);
people.push_back(info);
}
for (const auto& entry : people) {
ostringstream formatted, badNums;
for (const auto& nums : entry.phones) {
if (!valid(nums)) {
badNums << " " << nums;
}
else {
formatted << " " << nums;
}
}
if (badNums.str().empty()) {
cout << entry.name << ":" << formatted.str() << endl;
}
else {
cerr << "error in "<<entry.name << ":" << badNums.str() << endl;
}
}
return 0;
}