C++中的IO库提供了用于输入输出的各种流,除此之外还提供了管理流和缓冲区等功能。IO库结构如下图所示:

相同颜色的类位于同一个头文件中
- ios_base:表示流的基本特征;
- ios:继承于ios_base,提供了一个指向
streambuf的指针; - streambuf:为缓冲区提供了内存,并提供了用于操作缓冲区的方法;
- istream:继承于ios类,提供了输入方法;
- ostream:继承于ios类,提供了输出方法;
- iostream:继承于
istream和ostream,提供了输入输出方法; - ifstream:继承于
istream,提供了对文件进行输入的方法; - ofstream:继承于
ostream,提供了对文件进行输出的方法; - fstream:继承于
iostream,提供了对文件进行输入输出的方法; - istringstream:继承于
istream,对字符串进行操作的输入流类; - ostringstream:继承于
ostream,对字符串进行操作的输出流类; - stringstream:继承于
iostream,对字符串进行操作的输入输出流类;
1.标准IO
C++中为我们提供了四个标准IO对象:
- cin:标准输入流对象,默认情况下关联到标准输入设备(键盘)。
- cout:标准输出流对象,默认情况下关联到标准输出设备(显示器)。
- clog:表示错误的标准输出流对象,默认情况下关联到标准输出设备(显示器)。
- cerr: 用于日志记录的标准输出流对象,默认情况下关联到标准输出设备(显示器)。该流未被缓冲,这意味这信息将直接发送给屏幕,而不是等到缓冲区中填满数据或有新的换行符才会发送。
实际上应有8个对象,针对宽字符
wchar_t,以上4个对象都有对应的处理wchar_t的对象。
cout,clog,cerr默认都会输出到显示器,但对输出重定向后,只会影响cout输出内容,clog和cerr不受影响。
Linux系统中,运算符
2>可以重定向错误输出。
1.1.输入
使用cin进行读取已经用的够多了,常用的读取方法有:
operator >>:用于读取满足参数的类型(基本数据类型都可以),读取时将忽略空白符号;int get():读取单个字符,读取到文件尾时,返回EOF;istream& get (char& c):读取单个字符到c,读取到文件尾时,返回false;istream& get (char* s, streamsize n):用于读取C风格字符串,它不会丢弃换行符,换行符将继续留在输入缓冲区中,因此接下来的输入操作首先将读取换行符;istream& getline(char* s, streamsize n ):用于读取C风格字符串,通过换行符来确定行尾,但不保存换行符,而是将换行符用空字符来替换;
示例:
#include <iostream>
#include <cwchar>
int main()
{
char c;
std::cout << "please enter a character: ";
// 读取单个字符
std::cin.get(c);
std::cout << "you entered char: " << c << std::endl;
char firstname[12];
char lastname[20];
//清除缓冲区中的Enter
std::cin.get();
//读取c风格字符串
std::cout << "please enter first name: ";
//get(char*,int)会保留换行符,因此需要清除
std::cin.get(firstname,12).get();
std::cout << "please enter last name: ";
std::cin.getline(lastname,20);
std::cout << "your name: " << firstname << "." << lastname << std::endl;
return 0;
}
1.1.1.输入错误时的处理
ios_base中包含一个用来描述流状态的数据成员,由3个标记位组成:
ios_base::eofbit:当cin操作到达文件末尾时,设置此标记位;ios_base::failbit:当cin未能读取到预期字符时,设置此标记位;ios_base::badbit:当存在无法诊断的失败破坏流时,设置此标记位;
以上任何一个如果被设置,那么流将对后面的输入/输出关闭,直到位被清除。
clear()方法负责重置标记位。
示例:
#include <iostream>
int main()
{
using namespace std;
int score;
for (int i=0;i < 10;i++) {
cout << "please enter your score: ";
while(!(cin >> score)){
cin.clear(); //clear state bit
while(cin.get() != '\n') {
//清空输入队列中的错误字符
continue;
}
cout << "please enter a number: ";
continue;
}
cout << "your score: " << score << endl;
}
return 0;
}
1.2.输出
ostream类中对>>运算符做了重载,用来进行输出。除此之外,还有两个方法:
ostream& put (char c):向输出流中插入一个字符;ostream& write (const char* s, streamsize n):将s指向的数组的前n个字符插入到流中;
#include <iostream>
int main()
{
char ch;
char firstname

本文详细介绍了C++中的IO操作,包括标准IO中的输入输出方法,如cin、cout的使用,以及错误处理。接着,讨论了文件IO,包括ifstream和ofstream的构造方法和成员函数,以及二进制文件IO的操作。文章涵盖了输入输出的缓冲区管理、格式化输出以及错误处理策略,是理解C++ IO系统的重要参考资料。
最低0.47元/天 解锁文章
2723

被折叠的 条评论
为什么被折叠?



