第10章 C++的输入和输出流
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.1.5 输入输出符的重载
输入输出运算符的重载一般采用友元函数形式,格式如下:
friend istream& operator >> (istream& in, const ClassType &object); friend ostream& operator << (ostream& out, const ClassType &object);
其中,参数in是istream类对象的引用,out是ostream类对象的 引用,object是自定义的类类型的const引用。
10.1.6 文件的输入输出操作
1. 文件的打开
打开一个文件的方法有三种: ofstream <对象名>.open ("<文件名>", <打开方式>); ifstream <对象名>.open ("<文件名>"); fstream <对象名>.open ("<文件名>", <打开方式>); 其中,ofstream类对象打开一个用于输出的文件,即被写 入的文件,ifstream类对象打开一个用于输入的文件,即 被读取的文件,fstream类对象打开一个既可以输出又可 以输入的文件。
2. 成员函数put()
输出类ostream的成员函数put()用于输出一个字符,其格式 是: ostream& <类对象>.put (char ch); 其中,参数ch用于存储需要输出的字符,最常用的ostream 类对象是cout。例如: cout.put('X'); // 显示输出字母X 由于该函数的返回类型为ostream类对象的引用,所以它可 以被串联使用,例如: cout.put('G').put('o') .put('o') .put('d'); // 显示输出Good
以二进制方式打开文件,缺省时为文本方式 打开一个存在文件,若文件不存在,则打开失败 打开一个文件,若文件存在,但没有设置ate或app,则打开失败
10-2 文件的打开方式
2. 文件的关闭
为了保证写入数据的安全,在退出程序之前必须 关闭已经打开了的文件,断开文件和程序的连接, 释放相关的内存。关闭文件的格式如下: <文件类对象名>.close();
2. 文件的关闭
为了保证写入数据的安全,在退出程序之前必须 关闭已经打开了的文件,断开文件和程序的连接, 释放相关的内存。关闭文件的格式如下: <文件类对象名>.close();
2. 文件的关闭
为了保证写入数据的安全,在退出程序之前必须 关闭已经打开了的文件,断开文件和程序的连接, 释放相关的内存。关闭文件的格式如下: <文件类对象名>.close();
10.1.2 输出操作
1. 输出操作符<<
对于输出运算符“<<”,我们一定不会感到陌生,其应用格 式如下: <操作数1> << <操作数2> 其中,输出运算符“<<”表示数据从操作数2流向操作数1。 操作数1是输出类ostream的类对象,通常是cout,表示标准 的屏幕输出。 操作数2是存储输出流的变量或对象,它可以是内嵌类型 (int型、double型、char型、bool型等)的变量或表达式、指 针类型的变量,或自定义类对象。
4. 成员函数read()
输入类istream的成员函数read()的功能是从输入流中读取 指定数量的字符,其函数原型如下: istream& read(char * str, int length); 其中,参数str用于存放读入的字符,length为指定读入的 字符的数量。
10.1.4 格式化的输入输出操作
10.1.3 输入操作
1. 输入操作符>>
输入运算符“>>”的应用格式是: <操作数1> >> <操作数2> 其中,输入运算符“>>”表示数据从操作数1流向操作数2。 操作数1是输入类istream的类对象,常用的是标准的键盘输 入对象cin。 操作数2是存储输入数据的内嵌类型的变量或自定义的类对 象。如果操作数2是自定义的类对象,必须定义输入运算符的重 载函数。 注意:在缺省情况下,输入运算符“>>”会忽略空格、制表 符、换行符和回车
3. 成员函数write()
输出类ostream的成员函数write()用于输出一个指定长度的 字符串,其格式是: ostream& <类对象>.write (const char *str, int length); 其中,参数str用于存储需要输出的字符串,length用于指定 字符串中希望被输出的字符的个数,当length等于strlen(str) 时,输出整个字符串。 和函数put()一样,在函数write()中最常用的的ostream类对 象是cout。该函数的返回类型也是ostream类对象的引用, 所以也可以被串联使用。
2. 成员函数get()
输入类istream的成员函数get()可以读入一个字符或者一个字符串, 它不会忽略空格、制表符、换行符和回车,而是将它们也当作字符 一并读入。它有三种原型: int get(); // ① // ② istream& get(char& ch);
istream& get(char *str, int length, char delimiter = '\n'); // ③ 原型③是在参数的控制下读入若干个字符,结束读入操作的条件有 三种: (1)参数length,表示读入字符的数量不得多于length-1个; (2)参数delimiter,缺省值是换行符“\n”,用于指定一个特定的 字符,当遇到该字符时就停止读入操作。 (3)当遇到文件结束符EOF时。
3. 文件的顺序读写
文件的顺序读写是指从文件头一直读写到文件尾,通常采 用get()、getline()、put()、read()或write()等函数完成对文件 的读写操作。以get()函数为例: while (file1.get (ch)) // 读取文件中的内容并显示在屏幕上 cout.put (ch); 需要注意的是,在读取文件内容时,如果遇到文件结束符 EOF,读操作会被自动停止,与此同时,文件类对象也转 至“遇到文件结束符”的状态,不能再执行其他任何的输 入输出操作。如果需要继续读写该文件,必须调用函数 clear()清除文件类对象的状态,
有时,我们会希望按照一种特殊的格式输出各种数据。 例如,增加浮点数的精度,以十六进制显示整数,数据 的对齐方式,用字符串“true”或“false”输出bool变量值 等。 每一个iostream类对象都记录着当前的格式状态,通过一 组预定义的操纵符,就能够修改对象的格式状态,从而 控制数据的输入输出格式。操纵符的使用方法和普通的 数据一样,写在输入输出运算符的后面。 例如: //控制输出数据的宽度,用空格填充在数据的左侧 cout << set(w) << j;
10.1 循序渐进学理论
10.1.1 C++流的概念 流的概念
I/O流类库是一个利用多继承和虚拟继承实现的类层 次结构,如图10-1所示。它的主要作用是提供标准的、 基于文件的和基于字符串流的输入输出操作。程序员也 可以重载输入输出符,完成自定义类对象的输入输出操 作。
图10-1 C++的I/O流类库结构
第10章 C++的输入和输出流 章 的输入和输出流
本章要点:
C++流的基本概念 输出运算符<<、put()和write()的输出操作 输入运算符>>、get()、getline()和 read()的输入操作 格式化操纵符的应用 输入输出运算符的重载 文件的输入输出操作 字符串流的输入输出操作 流状态的错误处理
1. 基本的I/O流类库
在图10-1中,ios是虚基类,负责数据流的设置功能,类 istream负责输入流的操作,类ostream负责输出流的操作, 类iostream负责双向数据流的输入输出操作。 输入流是指从输入设备(键盘、文件等)流向计算机内存 的数据流,输出流是指从计算机内存流向输出设备(显示 器、文件等)的数据流。 在C++语言中,最常用的输入输出运算符是“>>”和“<<”, 为了使用基本I/O流类库提供的操作,必须在程序中包含头 文件iostream: #include <iostream>
C++提供的打开方式如表10-2所示:
方 式 in out app ate trunk 以读方式打开文件 以写方式打开文件 以追加写入方式打开文件 文件打开后,文件指针位于文件尾 若文件存在,令其长度为0,清除原有的内容;若文件不存在,则创建新文件 含 义
binary nocreate noreplace
定位文件写指针的重载函数是:
ostream & ostream:: seekp(int position ); ostream & ostream:: seekp(int offset_position, ios_base::seekdir way);
10.1.5 字符串流的输入输出操作
1. 字符串流的输入操作
wk.baidu.com
4. 文件的随机读写
C++还提供对文件的随机读写能力,用定位成员函数seekg() 或seekp()将文件的读写指针移到指定的位置。 移动文件读写指针的方法有两种,一是直接将指针移到指 定的位置,二是在某个参照位置的基础上,将指针移动一 定的偏移量。所以,定位文件读指针的重载函数集是:
istream & istream:: seekg(int position); istream & istream:: seekg(int offset_position, ios_base::seekdir way);
2. 文件I/O流类库
在图10-1中,类ifstream、类ofstream和类fstream分别继承 于基本I/O流类库中的类iostream、类ostream和类iostream, 它们还有一个公共基类fstreambase,在图10-1中没有列出。 其中,类ifstream提供文件的输入操作,即读取文件的内容 到内存,类ofstream提供文件的输出操作──即将内存中的 数据写入文件,类fstream同时提供文件的输入和输出操作, 详见10.1.6节。 为了使用文件I/O流类库提供的操作,必须在程序中包含头 文件fstream: #include <fstream>
3. 字符串I/O流类库
在 图 10-1 中 , 类 istringstream 、 类 ostringstream 和 类 stringstream分别继承于基本I/O流类库的类iostream、类 ostream 和 类 iostream , 它 们 还 有 一 个 公 共 基 类 strstreambase,在图10-1中没有列出。 其中,类istringstream提供从字符串中读取数据的操作, 类 ostringstream 提 供 将 数 据 写 入 字 符 串 的 操 作 , 类 stringstream同时提供字符串的读取和写入操作。 为了使用字符串I/O流类库提供的操作,必须在程序中包 含头文件sstream: #include <sstream>
3. 成员函数getline()
输入类istream的成员函数getline()的原型如下: istream& getline(char *str, int length, char delimiter = '\n'); 它和函数get()的功能基本相同,用于读取一串字符,直 到读入字符的个数大于length-1,或者遇到文件的结束符 EOF,或者遇到delimiter。 但是,函数getline()要比函数get()好用得多,因为它能够 自动丢弃delimiter,而不会将它留在istream中作为下一个 输入的字符。
在使用字符串流的输入操作时,必须定义一个ostringstream 类对象,例如: ostringstream buffer; // 定义一个ostringstream对象buffer ostringstream类对象有两个重要的特点:一是它的长度能够 随着输入的字符而自动增长;二是它能够复合各种类型的 数据,并将它们自动转换成字符串。 为了实现基于字符串的操作,ostringstream类提供了一些成 员函数,常用的有: string ostringstream:: str(); // 返回ostringstream类对象中输入 的字符串