第4章 C++的输入输出流及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 重载操作符<<
• 当实现一个类类型时,如果希望这个类支持输入和输出操作符,那么必 须提供重载的输入和输出操作符的实例; • 输出操作符是一个双目操作符,它返回一个ostream引用,重载定义的 通用框架如下所示: ostream& operator<<(ostream& os, const ClassType& object)
算机科学与技术系刘恒洋
4.1.2 C++对流文件的操作
ios::app:打开一个已经存在的文件用于输出,使输出追加到文件尾部 有一个文件名称; ios::ate:以附加模式打开一个已经存在的文件用于输出,文件指针自动移到文件尾部 ios::in:打开一个已经存在的文件用于输入 • 在C++中可以处理文件的流类有:ifstream, ofstream, fstream,它们 ios::out:打开一个文件用于输出,如果文件不存在则自动创建,该值为默认值 对文件的操作可以分为4步: ios::trunc:打开一个文件用于输出,文件已经存在则删除原有内容,不存在则创建 – 定义文件流类对象 ios::nocreate:打开一个文件,如果文件不存在则打开文件失败 – 打开文件 ios::noreplace:打开文件,如果文件已经存在则打开文件失败 ios::binary:以二进制方式打开文件 – 对文件进行读写操作 注:多种打开方式可以组合;对于有默认值的可以不指定打开方式 – 关闭文件
4. 数组和容器类型的输出
• 理解程序4.4.cpp
5. 输入操作符>>
• 考虑语句:while(cin>>ival): int item_number; string item_name; double item_price; – 语句表示:从标准输入读入一个序列,直到cin为false为止; cout<<"Please enter the item_number, item_name, and price: "<<endl; – 当读到文件结束标记或遇到一个无效的输入值,cin>>返回false; cin>>item_number; cin>>item_name; cin>>item_price; cout<<"The values entered are: item# " – 在读入一个无效值的情况下,cin被放置到一种错误的状态中,并且 <<item_number<<" " <<item_name<<" @$" <<item_price<<endl; 对于值的所有读入动作都将被停止。 运行,从键盘输入:10247 widget 19.99 回车,输出结果为: The预定义的输入操作符可以接受任何的内置数据类型,如: • values entered are: item# 10247 widget @$19.99 • “数值的读操作”比“数值的写操作”更容易导致iostream错误; • C++不推荐使用连接形式的的输入操作符; • 对于字符串的输入操作,C++推荐使用string类型,而不是char*; • 理解程序4.4.cpp。
• 文件是存储在磁盘、磁带等外部设备上的数据集合,每一个文件都必须
1. 定义流类对象 2. 打开文件
void open(const unsigned char* filename, int mode, int access = filebuf::openprot);
• access:文件的系统属性(0、1、2、3);nMode:打开模式,取值为:
2010年10月 重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋 共13页第5页
6. 条件状态
• 只有流对象处于正常状态下,输入才能正确继续执行,可以通过以下方 式来判断流对象是否处于正常状态:
if(!cin) //判断cin是否处于错误状态 //读入出错
• 流对象有四种状态标志:ios_base::eofbit、ios_base::badbit、 ios_base::failbit和ios_base::goodbit,这几种标志的结果可以通过 流对象调用对应的函数来获取
简化的iostream类层次结构
• 在C++中,输出主要由左移操作符(<<)来完成;输入主要由右移操作符 (>>)来完成; • C++还支持对文件和内存的输入/输出,他们分别由类ifstream、 ofstream和fstream以及istringstream、ostringstream和 2010年10月 共13页第2页 stringstream来支持。 重庆理工大学计算机科学与工程学院计
• 理解程序4.14.cpp
2010年10月 重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋 共13页第11页
4.5 格式控制
每一个iostream库对象都维护一个格式状态,它控制格式化操 作的细节,C++提供了一组预定义操作符,用来修改对象的格 式状态。
4.5.1 布尔量的输出控制操作符
– cin,代表标准输入的istream类对象,允许从用户终端读入数据; – cout,代表标准输出的ostream类对象,允许向用户终端写数据; – cerr,代表标准错误的ostream类对象,是导出程序错误消息的地方。
istream ostream
iostream ifstream 非虚拟继承 fstream ofstream 虚拟继承
2010年10月
重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋
共来自百度文库3页第10页
4.4 read()和write()输入/输出函数
• write()输出固定长度的字符序列,read()从输入流中读入固定长 度的字符序列,通过函数gcount()可以获取由最后一个read()调 用提取的字节数,它们的函数原型如下:
2. 变量地址输出
• 默认情况下C++按十六进制输出地址值; • 默认情况下char*输出的是他所指向的字符串的内容,而不是地址; • 理解程序4.2.cpp。
3. 输出操作符的优先级
2010年10月
• 理解并修改程序4.3.cpp。
共13页第4页
重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋
2010年10月 重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋 共13页第9页
4.3.2 get()和put()用于文件输入/输出
• 当把一个ifstream、ofstream或fstream对象与get、put或 getline函数关联起来,则这三个函数就可以对文件进行输 入/输出操作了,理解程序4.12.cpp。
ostream& write(const char* sink, streamsize length); istream& read(char* addr, streamsize size);
4.4.1 read()和write()函数用于标准输入/输出
• 理解程序4.13.cpp
4.4.2 read()和write()函数用于文件输入/输出
2010年10月
重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋
共13页第8页
4.3 get()和put()输入/输出函数
4.3.1 get()和put()用于标准输入/输出
• get()和put()函数比较适合不知道输入输出的具体数据类型,而 只是按字节逐字读/写的场合; • get()一次读入一个字节,put()一次输出一个字节,这两个函数 通常配合在一起使用; • get()函数有三种形式,形式一参见程序4.8.cpp,形式二参见程 序4.9.cpp,形式三参见程序4.10.cpp; • istream& ignore(streamsize length = 1, int delim = traits::eof):从输入流中读入并丢弃length个字符,或者遇到 delimiter之前包含delimiter在内的所有字符,或者直到文件结 尾,如程序4.10.cpp ; • istream& getline(char* sink, streamsize size, char delimiter=‘\n’):功能跟get()的第三种形式类似,但是它直接丢 弃delimiter而不是将其留作输入流的下一个字符,如程序 4.11.cpp。
3. 关闭文件
• 理解程序4.1.cpp。
2010年10月 重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋 共13页第3页
4.2 >>和<<输入/输出操作符
4.2.1 >>和<<用于标准输入/输出 1. 常见的输出
• 输出操作符可以接受任何内置数据类型的实参,包括const char*, string,complex,表达式和函数调用等; • endl是一个ostream操作符,它把一个换行符插入到输出流中,再刷新 ostream缓冲区; • 由于输出操作符<<为左结合性,同时输出操作后的返回结果是一个 ostream对象,所以多个输出操作符<<可以连接在一起。
{ os << //按照需要的格式进行输出 return os; //返回ostream对象
}
• 第1个参数是一个ostream对象的引用,第2个参数一般是一个特定类类 型的const引用,返同类型是一个ostream引用,且它的值总是该输出操 作符所应用的ostream对象; • 因为第1个实参是一个ostream引用,所以输出操作符必须定义为非成员 函数,当输出操作符要求访问非公有成员时,必须将它声明为该类的友 元,理解程序4.6.cpp。 2010年10月 共13页第7页
第4章 C++的输入/输出流及其应用
重点 1.<<和<<的使用 2.get()和put()的使用 3.read()和write()的使用 4.输入/输出中的格式控制 5.示例系统的输入/输出类设计
2010年10月 重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋 共13页第1页
4.1
概述
– if(inOut.eof()) – if(inOut.bad()) – if(inOut.fail()) – if(inOut.good())
• 可以通过以下两种方式显示地修改流对象的状态值:
– cin.clear(); //将cin重设为正常状态 – cin.setstate(ios::failbit); //将cin设为failbit状态 – cin.setstate(ios::badbit | ios::failbit); //同时设置多个状态
ios
4.1.1 C++输入/输出流类库
• C++的输入/输出流由iostream提供; • iostream为内置数据类型提供了默认的输 入/输出操作; • 用户可以通过扩展iostream来支持新数据 类型的输入/输出; • iostream类库的层次关系如右图:
• iostream类库中定义了三个标准的流对象
重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋
2. 重载操作符>>
• 跟输出操作符类似,重载输入操作符的通用框架如下所示:
istream& operator>>(istream& is, ClassType& object) { is >> //按照需要的格式输入 return is; //返回istream对象 }
• 相对于输出操作符,输入操作符的重载更容易出错,理解程 序4.7.cpp,
– 由于不正确的格式而导致失败,istream应该把状态标记为fail: is.setstate(ios::failbit); – 如果istream对象is处于错误状态,则对istream对象的操作一直无 效,这就是while(is && (ch = is.get()) != ‘>’)要双重判断的原 因;
2010年10月 重庆理工大学计算机科学与工程学院计 算机科学与技术系刘恒洋 共13页第6页
4.2.2 >>和<<用于文件输入/输出
• 通过ifstream, ofstream, fstream对象和<</>>操作符可以直接对文件 进行输入/输出,理解程序4.5.cpp;
4.2.3 >>和<<操作符的重载
相关文档
最新文档