第13章c++流与文件

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

istrstream(从istream派生,从一个字符串读取数据) ostrstream(从ostream派生,写入一个字符串中) strstream(从iostream派生,从字符串中读取或写到字 符串中去)

头文件 strstrea.h
例:字符串流类
void main() { istrstream is("Hello World 1234"); char s1[20]; strstream ss;//I/O字符串流类 char s2[20]; ss << "Hello" << " " << int i; "World" << " " << 1234; is >> s1 >> s2 >> i; char s1[20]; cout << s1 << endl; char s2[20]; cout << s2 << endl; int i; cout << i << endl; ostrstream os; ss >> s1 >> s2 >> i; os<<s1<<s2<<i; cout << s1 << endl; cout << os.str(); cout << s2 << endl; } cout << i << endl;
ostrstream
fstream
类名ቤተ መጻሕፍቲ ባይዱ
说明
流基类 通用输入流类和其他输入流的基类 输入文件流类 cin的输入流类 输入字符串流类 通用输出流类和其他输出流的基类 输出文件流类 cout,cerr和clog的输出流类 输出字符串流类 通用I/O流类和其他I/O流的基类 I/O文件流类 I/O字符串流类
friend ostream& operator << (ostream& stream, <类名>& <类引用名>)
{
//函数体 return stream;
}
1. 第一个参数:ostream类对象的一个引用,即 stream必须是一个输出流。 2. 第二个参数:<类引用名>接收待输出的对象。 3. 函数返回值:ostream的一个引用stream。
文件流类

iostream库还支持对文件的读写。下列三种类 类型提供了文件支持。



ifstream(从istream派生,把一个文件绑到程序 上用来输入) ofstream(从ostream派生,把一个文件绑到程 序上用来输出) fstream(从iostream派生,把一个文件绑到程序 上用来输入输出)

则i的值为123,前面的两个空格被跳过,"123"被读 入作为i的值,且输入指针指在"x"处。
(2)当变量类型为浮点数时


同整数提取运算符 跳过空格,然后读字符,直到发现非浮点数。
(3)当变量类型为字符时 跳过空格,读取输入流中的下一个字符
<空格>x 则字符型提取运算符忽略空格而返回"x"。
(4)读取字符串, 它跳过前导空格,然后读取所有输入字符,直 到遇到另一个空格。
13.1.1
预定义流
输入和输出操作是由istream(输入流)和ostream(输出 流)类提供的(第三个类iostream类同时从istream和 ostream派生,允许双向输入输出)。为了方便,这个库定 义了下列四个标准流对象。

cin cout cerr clog
含义
标准输入 标准输出 没有被缓冲的标准错误输出 被缓冲了的标准错误输出


第一个参数是istream类对象的一个引用,即stream 必须是一个输入流。 第二个参数<类引用名>接收输入对象的引用。 该函数返回istream的一个引用stream。
[例13.4]
#include <iostream.h> class Sample { int x, y; public: Sample() { } friend istream& operator>> (istream & stream, Sample& s); friend ostream& operator<<(ostream & stream, Sample& s); };
13.3.2 重载输入运算符">>"

“>>”运算符称为提取运算符,对它进行重载的函数称 为提取符函数。这个运算符函数接收流的输入信息。
friend istream& operator >>(istream& stream, <类名>& <类引 用名>) { //函数体 return stream; }
包含文件
iostream.h iostream.h fstream.h iostream.h strstrea.h iostream.h fstream.h iostream.h strstrea.h iostream.h fstream.h strstrea.h
抽象流基类
ios
输入流类
istream ifstream istream_withassign istrstream

头文件fstream.h
13.3
重载I/O运算符(<<,>>)
C++ I/O系统的另一个优点是可 以重载I/O运算符。通过重载I/O运算 符,可以建立适合于类需要的输入和输 出界面。 I/O运算符重载的实质就是把用 于变量输入输出的运算符转化为对于类 对象的输入输出操作。
13.3.1 重载输出运算符"<<"
cerr 和clog
cerr和clog用于标准错误输出

cerr类似标准错误文件。cerr与cout的差别在于:

cerr是不能重定向的; cerr不能被缓冲,它的输出总是直接传送到标准输出设备

clog类似cerr,也是不能重定向的,但可被缓冲。比 cerr显示速度快 cerr << “Error” << “\n”; 或 clog << "Error" << "\n"; 错误信息是写到cerr的项。则错误信息"Error"总能保 证在显示器上显示出来:
cout << name << “ ”<< number << „\n‟; 等价于 cout << name; cout << " "; cout << nember; cout << '\n';
2. cin-输入提取运算符
cin与标准输入设备连接的预定义输入流,称为源。 从输入流中取出数据,数据从输入提取运算符“>>” 处流进程序。为了保留输入数据,输入语句要求有目 的地址。 “>>”可以接受任何内置的数据类型,包括C风格的 字符串以及标准库中的某些类类型。
字符串输入
将每个字符串读入一个数组缓冲区中,然后从空闲存储区中 分配“正好可以存放这个字符串”的内存,并把缓冲区拷贝 到这个按需分配的内存区中。 #include <iostream.h> #include <string.h> void main() { char inBuf[1024]; cin>>inBuf; char *str=new char[strlen(inBuf)+1]; strcpy(str,inBuf); ... delete[] str; }


使用格式化I/O
#include <iostream.h> #include <iomanip.h> void main() { const int bufSize=24; char buf[bufSize]; cin>>setw(bufSize)>>buf; ... } 这里bufSize是字符数组buf的长度,setw()把长度 等于或大于bufSize的字符串分成最大长度为bufSize -1的两个或多个字符串。在每个新串的末尾放一个空 字符。
输出流类
ostream ofstream ostream_withassign ostrstream
I/O流类
iostream fstream strstream
字符串流类


除了对用户终端的读写操作,iostream库还支持内存 输入输出,当流被附着在程序内存中的一个字符串上 时,可用iostream输入和输出操作符来对它进行读写。 可以通过定义下列三种类类型中的一个实例来定义一 个字符串处理对象。

C++语言中没有专门的输入/输出(I/O)语句, C++中的I/O操作是通过一组标准I/O函数和 I/O流来实现的。


C++的标准I/O函数是从C语言继承而来的,同时 对C语言的标准I/O函数进行了扩充。 C++的I/O流是通过iostream库提供的,它是一个 利用多继承和虚拟继承实现的面向对象类层次结 构,是做为C++标准库的一个组件而提供的。
13.1.2C++的流类库

C++提供了一个流类库,流类库的基础类 利用继承关系组织起来,其类层次如图所示。
ios
istream iostream istrstream istream_ withassi gn ifstream
ostream
ofstream ostream_ withassi gn strstream
int i; cin >>i; 提取运算符">>"从cin参数中提取一个整型输入数据,并存 入一个对象(变量) i。
跳过空格 根据默认定义,内部类型的提取运算符跳过 (丢弃)任何中间空白(空格,制表符、换行、 回车)。 (1)当变量类型为整数时

跳过空格读取字符,遇到不为整数的字符为止。
<空格><空格>123x2,
[例13.3]
#include<iostream.h> class Sample { int x, y; public: Sample(int x1, int y1){ x = x1; y = y1; } friend ostream& operator<<(ostream& stream, Sample& s) { stream << "x=" << s.x << ",y="<< s.y << endl; return stream; } }; void main() x=1,y=2 { Sample A(1,2); x=3,y=4 Sample B(3,4); cout << A << B; //调用了Sample类中定义的插入符重载 }
所属类
istream类 ostream类 ostream类 ostream类
默认设备
键盘 显示器 显示器 显示器
对应的头文件 iostream.h
输入输出 输入操作主要由重载的右移操作符(>>) 来完成,是从流中提取一个字符序列,因此, 将">>"称为提取运算符。 输出操作主要由重载的左移操作符(<<) 来完成,是向流中插个字符序列,因此将"<<" 称为插入运算符。
1. cout-插入运算符
cout:标准输出设备连接的预定义输出流,称为汇。 1. <<"向输出流发送字符。实际上,位于插入运算符 右侧的字符串被存储在"<<"左侧的流中。 2. “<<”接受任何内置数据类型的实参,包括const char *以及标准库中定义的某些类类型。 3. <<输出操作符可被连接在一起。

它为内置数据类型的输入输出提供了支持,同时也支持 文件的输入输出。除此外,类的设计者还可以通过扩展 iostream库来读写新的类类型。
13.1
什么是流
数据从一个对象到另一个对象的传送被抽象为“流”。数 据的输入/输出就是通过输入/输出流来实现的。流是一种 抽象的概念,负责在数据的产生者和数据的使用者之间建 立联系,并管理数据的流动。 流:C++中数据的传输操作。 输出流:在C++中,流可以表示数据从内存传送到某个载 体或设备中。 输入流:流可以表示数据从某个载体或设备传送到内存缓 冲区变量中。 流的机制: 1.流都是相同的,但载体可以不同。 2.无论与流相联系的实际物理设备差别有多大,流都采用 相同的方式运行。


例1: char str[20]; cin >> str; 例2:键盘键入"ABCD EFG", 则只有“ABCD”被读取到str中,而“EFG”将 继 续留在输入流缓冲区中,直到下次提取。
与插入运算符一样,也可以把多个提取运算符连在— 条语句中,读取多个数据项。例如: char name[20]; int age; cin >> name >> age; 在此例中,如果给name键入的字符超过20个,则输 入文本将溢出变量name的内存区域而覆盖变量age, 甚至还可能覆盖程序的部分指令。这样就会破坏程 序。所以需要由一种方法将数组变量或指针的长度 准确告诉流,可通过格式化I/O来做。
相关文档
最新文档