45
Object-Oriented Programming in C++ 第第第 第第第第第 中中中中中中中中中中中 中中 [email protected]

Object-Oriented Programming in C++ 第七章 输入输出流

  • Upload
    tam

  • View
    154

  • Download
    0

Embed Size (px)

DESCRIPTION

Object-Oriented Programming in C++ 第七章 输入输出流. 中国科大学继续教育学院 李艺 [email protected]. 第一章 C++ 的初步知识 第二章 类和对象 第三章 再论类和对象 第四章 运算符重载 第五章 继承与派生 第六章 多态性与虚函数 第七章 输入输出流 第八章 C++ 工具. 7.1 C++ 的输入与输出 7.2 标准输出流 7.3 标准出入流 7.4 文件操作与文件流 7.5 字符串流. 7.1 C++ 的输入和输出. - PowerPoint PPT Presentation

Citation preview

Page 1: Object-Oriented Programming  in C++ 第七章 输入输出流

Object-OrientedProgramming in C++第七章 输入输出流

中国科大学继续教育学院 李艺[email protected]

Page 2: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 2

第一章 C++ 的初步知识

第二章 类和对象第三章 再论类和对象第四章 运算符重载第五章 继承与派生第六章 多态性与虚函数第七章 输入输出流第八章 C++ 工具

Page 3: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 3

7.1 C++ 的输入与输出7.2 标准输出流7.3 标准出入流7.4 文件操作与文件流7.5 字符串流

Page 4: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 4

7.1 C++ 的输入和输出 输入输出的含义:从操作系统角度看,每一个与主机相连的输入输

出设备都被看做一个文件。终端键盘是输入文件,终端显示器是输出文件。磁盘或光盘也可以被看作是输入输出文件。 程序的输入:指的是从输入文件将数据传送给程序; 程序的输出:指的是从程序将数据输出给输出文件。

C++ 的输入输出包括以下三个方面的内容: 标准设备输入输出,从键盘输入。输出到显示器。简称标准 I/O 。 以外存储器文件为对象的输入输出。指从磁盘文件中输入数据,

将数据输出到磁盘文件中。简称文件 I/O 对内存中指定的空间进行输入输出。通常指定一个字符数组作为

存储空间,它称为字符串输入输出,简称串 I/OC++ 采取了不同的方法,实现这三种输入输出。

Page 5: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 5

7.1 C++ 的输入和输出C++ 输入输出流

C++ 的输入输出流是指由若干字节组成的字节序列。在内存中,系统为每一个数据流开辟一个缓冲区,用来存放流中的数据。当使用 cout 和插入符“ <<” 输出数据时,先将这些数

据送到程序中的输出缓冲区保存,直到缓冲区满了或遇到endl ,就将缓冲区中的全部数据送到显示器。

在输入时,从键盘输入的数据先放在键盘缓冲区中,形成 cin 流,然后用提取运算符“ >>” 从输入缓冲区提取数据,送给程序中的相关变量。

总之,内存缓冲区中的数据就是流。

Page 6: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 6

7.1 C++ 的输入和输出流类与流对象:在 C++ 中,输入输出流被定义成类, C++

的 I/O 库中的类称为流类 ( stream class ) 。用流类定义的对象称为流对象。

cout 和 cin 并不是 C++ 提供的语句,它们是iostream 类的对象。正如 C++ 没有提供赋值语句,只提供了赋值表达式(表达式后面加分号,形成语句)。

在 iostream 头文件中重载运算符:“ <<” 和“ >>”在 C++ 中是位移运算符,由于在 iostream 头文件中对它们进行了重载,使它们能用做标准输入输出运算符,所以,在用它们的程序中必须使用 #include <iostream> 语句把iostream 类包含到程序中。

下面我们来看看 I/O 类库中类的情况。

Page 7: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 7

7.1 C++ 的输入和输出 I/O 类库中常用的流类

strstreamstrstreamstrstream

输入字符串流类输出字符串流类输入输出字符串流类istrstreamostrstreamstrstream

fstreamfstreamfstream

输入文件流类输出文件流类输入输出文件流类ifstreamofstreamfstream

iostreamiostreamiostream

通用输入流和其他输入流的基类通用输出流和其他输出流的基类通用输入输出流和其他输入输出流的基类istreamostreamiostream

Iostream抽象基类ios

在哪个头文件中声明 作用 类名

Page 8: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 8

7.1 C++ 的输入和输出iostream 文件中定义的 4 种流对象

stderrostream_withassign屏幕标准错误流clog

stderrostream_withassign屏幕标准错误流cerr

stdoutostream_withassign屏幕标准输出流cout

stdinistream_withassign键盘标准输入流cin

C语言对应文件对应的类对应设备含义对象

说明 cin 是 istream 的派生类 istream_withassign 的对象,它是从键盘输入数据流到内存; cout 是 ostream 的派生类 ostream_withassign 的对象,它从内存输出数据流到显示器; cerr 和 clog 相似,均为向显示器输出出错信息

Page 9: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 9

7.2 标准输出流 Cout, cerr 和 clog 流

ostream 类定义了 3 个输出流对象,即 cout, cerr 和 clog 。

I. cout 流对象: cout 这是 console output 的缩写,意为控制台输出。这里强调几点:

① cout 不是 C++ 预定义关键字,它是 ostream 流类对象,在 iostream 中定义。 cout 流是流向显示器的数据。 cout 流中的数据是用流插入运算符“ <<” 顺序加入的。 cout 流是容纳数据流的载体,不是运算符。

② 用“ cout<<” 输出基本类型数据时,可以不考虑数据是什么类型系统会自动判断其类型,并选择调用匹配的运算符重载函数。

Page 10: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 10

7.2 标准输出流II. clog 流对象:也是标准出错流,是 console log 的缩写。作用和 cerr 相同。区别在于, cerr 不经过缓冲区,直接向显示器输出,而 clog 经过缓冲区,缓冲区装满后或遇到 endl 时,向显示器输出。

#include <iostream.h>#include <math.h>void main( ){ float a,b,c,disc; cout << "please input a, b, c:"; cin >> a>>b>>c; if (a==0) cerr <<"a is equal to zero,error!"<<endl; else if ((disc=b*b-4*a*c)<0) cerr << "disc=b*b-4*a*c <0 " <<endl; else { cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl; cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl; }}

Page 11: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 11

7.2 标准输出流III. clog 流对象:也是标准出错流,是 console log 的缩写。

作用和 cerr 相同。区别在于, cerr 不经过缓冲区,直接向显示器输出,而 clog 经过缓冲区,缓冲区装满后或遇到 endl 时,向显示器输出。

Page 12: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 12

7.2 标准输出流格式输出:输出数据时,为简便起见往往不指定输出格式。但也可以指定输出格式。

输出格式有两种方法:① 使用控制符输出格式;② 使用流对象的有关成员函数。 使用控制符输出格式:这些控制符是在头文件 iomanip 中定义。程序必须包含该头文件。

控 制 符 作 用dec, hex, oct 分别设置整数的基数为 10 、 16 、 8

setbase (n) 设置整数基数为 n ( n 为 10,16,8 三者之一 )

setfill ( c ) 设置填充字符 c , c 是字符常量或变量setprecision (n) 设置实数精度为 n 位setw (n) 设置字段宽度为 n

setiosflags (ios::left / right ) 输出数据左 /右对齐resetioflags ( ) 终止已设置的输出格式,在括号中指定内容

Page 13: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 13

7.2 标准输出流#include <iostream.h>#include <iomanip.h>int main( ){ int a=123; char *pt = “China”; double pi = 22.0/7.0;

cout <<“dec:”<<dec<<a<<endl; cout <<“hec:”<<hex<<a<<endl; cout <<“oct:”<<oct<<a<<endl; cout<<setw(10)<<pt<<endl; cout<<setfill(‘*’)<<setw(10)<<pt<<endl;

cout<<“pi=”<<pi<<endl; cout<<“pi=“<<setprecision(4)<<pi<<endl; cout<<“pi=“<<setiosflags (ios::fixed) <<pi<<endl; return 0;}

Page 14: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 14

7.2 标准输出流用流对象的成员函数控制输出格式:用于输出流控制符的成员函数见下表:

说明:成员函数 width 和控制符 setw( ) 只对其后的第一个输出项有效。

流成员函数 相同作用的控制符 作用precision (n) setprecision (n) 设置实数的精度为 n

width (n) setw (n) 设置字段宽度fill (c) setfill ( c ) 设置填充字符setf( ) setiosflags ( ) 设置输出格式状态unsetf ( ) resrioflags ( ) 终止已设置的输出格式

Page 15: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 15

7.2 标准输出流#include <iostream.h>int main( ){ int a = 21; cout.setf(ios::showbase); cout<<"dec:"<<a<<endl; cout.unsetf(ios::dec); cout.setf(ios::hex); cout<<"hex:"<<a<<endl; cout.unsetf(ios::hex); cout.setf(ios::oct); cout<<"oct:"<<a<<endl; cout.unsetf(ios::oct);

char *pt = "China"; cout.width(10); cout<<pt<<endl; cout.width(10); cout.fill('*'); cout<<pt<<endl;

double pi = 22.0/7.0; cout.setf(ios::scientific); cout<<"pi="<<pi<<endl; cout.width(15);

cout.unsetf(ios::scientific);

return 0;}

Page 16: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 16

7.2 标准输出流用流成员函数 put 输出字符

我们已经知道,程序中一般用 cout << 实现输出,cout 流在内存中有相应的缓冲区。

有时,我们想只输出一个字符, ostream 类提供了 put 成员函数来满足这一特殊需求:

#include <iostream.h>int main( ){ char *a = "BASIC"; for (int i=4; i>=0; i--) cout.put(*(a+i)); cout.put('\n'); return 0;}

Page 17: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 17

7.3 标准输入流 cin 流: cin 流是 istream 类的对象。它从标准输入设备(键盘)获取

数据,程序中的变量通过流提取符“ >>” 从流中提取数据。 用于字符输入的流成员函数:用 get 函数读入一个字符: get 函数有三

中形式:无参数、有一个参数和 3 个参数的形式。 不带参数的 get 函数:其调用形式为: cin.get ( )

#include <iostream.h>

int main( )

{ char c;

cout<<“input a sentence,please: "<<endl;

while ((c=cin.get())!=EOF)

cout<<c;

return 0;

}

Page 18: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 18

7.3 标准输入流有一个参数的 get 函数:调用形式为: cin.get(ch) 。作

用是从输入流中读取一个字符,并赋给变量 ch 。#include <iostream.h>int main( ){ char c; cout<<"inpute a sectence,please: "<<endl; while (cin.get(c)) { cout.put(c); } cout<<"end"<<endl; return 0;}

Page 19: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 19

7.3 标准输入流有三个参数的 get 函数:调用形式:

cin.get ( 字符数组 / 字符指针,字符个数 n ,终止字符 )其作用是,从输入流中读取 n-1 个字符,并赋给指定的数组(或指针指向的数组)。如果在读取中遇见终止字符,则提前结束读取操作。#include <iostream.h>int main( ){ char ch[20]; cout<<"inpute a sectence,please: "<<endl; cin.get(ch,18,'\n'); cout<<ch<<endl; return 0;}

Page 20: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 20

7.3 标准输入流 用成员函数 getline 读入一行字符。调用形式:

getline ( 字符数组 / 字符指针 , 字符个数 n, 终止字符 )作用是从读入流中读取一行字符,并赋给字符数组。

#include <iostream.h>int main( ){ char ch[20]; cout<<"inpute a sectence,please: "<<endl; cin>>ch; cout<<"The string read with cin is: “ <<ch<<endl; cin.getline(ch,20,'/'); cout<<"The second part is: "<<ch<<endl; return 0;}// 程序运行时,输入一句话:“ I like C++”回车后,再输入另一句话:“ We like , too.”

Page 21: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 21

7.3 标准输入流istream 类其它成员函数

eof 函数:表示文件结束。从输入流中读入文件,当达到文件尾,则 eof 函数值为非 0 (表示真),否则为 0 ( 假 ) 。

#include <iostream.h>int main( ){ char c; while (!cin.eof()) if ((c=cin.get())!=' ') cout.put(c); else cout.put('_'); return 0;}

Page 22: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 22

7.3 标准输入流peek 函数:其功能是指针指向的当前字符,指针不动。

若要访问的字符是文件结束符,则函数值为 EOF(-1) 。调用形式:

c = cin.peek( );putback 函数:功能是将 get 或 getline 函数从输入流中读取的字符 ch返回到输入流,插入到当前指针位置,供以后读取。调用形式为:

cin.putback(ch);ignore 函数:跳过输入流中 n过字符,或遇到终止符结束。调用形式为:

cin.ignore( 跳过的字符数 n, 终止字符 )

Page 23: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 23

7.4 文件操作与文件流文件的概念:文件一般是指存储在外部介质上的数据集合。

我们主要是指数据文件。根据数据的组织形式,数据文件分为:ASCII 文件:又称为文本文件,它的每一个字节放一个

ASCII代码,代表一个字符。二进制文件:又称为内部格式文件,它把数据按其在内存

中的存储形式远洋输出到磁盘上存放。对于字符信息,在内存中是以 ASCII代码形式存放的,

因此,无论用 ASCII 文件输出,还是用二进制文件输出,其数据形式是一样的。但是对于数值数据,二者是不同的。

Page 24: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 24

7.4 文件操作与文件流文件流类与文件流对象:文件流是以外存文件为输入输出对象的数据流。

输出文件流是从内存流向外存文件的数据;输入文件流是从外存文件流向内存的数据。文件与文件流的区别:文件流不是文件,而只是以文件为输入输出对象的流。C++ 定义的文件类:

ifstream 类,是 istream 类派生,用于从磁盘文件输入数据。 ofstream 是 ostream 类派生,用于向磁盘文件的输出。 fstream 是 iostream 类的派生,用于磁盘文件的输入输出。

Page 25: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 25

7.4 文件操作与文件流 文件的打开与关闭

打开磁盘文件:打开文件是指在文件读写之前做必要的准备工作。包括: 为文件对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件; 指定文件的工作方式,如,是读文件还是写文件,是操作ASCII 文件还是二进制文件。

打开文件有两种实现方式: 调用文件流的成员函数 open 。一般形式为:

文件流对象 .open ( 磁盘文件名, 输入输出方式 );注意,磁盘文件名可以包括路径,省略路径则默认为当前目录。如:

ofstream outfile; // 定义 ofstream 类对象 outfile outfile.open (“fi.dat, ios::out ); // 使文件流与 f1.dat 文件建立关联

Page 26: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 26

7.4 文件操作与文件流在定义文件流对象时指定参数:比如

ostream outfile (“f1.dat”, ios::out );一般常用这种形式来打开文件。

Page 27: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 27

7.4 文件操作与文件流 文件的输入输出方式设置值:

方式 作用ios :: in 以输入方式打开文件ios :: out 以输出方式打开文件。若文件存在,则清除原内容ios :: app 以输出方式打开文件。写入的数据增加在文件末尾ios :: ate 打开已有文件,文件指针指向文件末尾ios :: trunc 打开文件,若文件存在,则删除原数据ios :: binary 以二进制方式打开文件ios :: in | ios :: out 以读写方式打开文件ios :: out | ios :: binary 以二进制方式打开输出文件ios :: in | ios :: binar 以二进制方式打开输入文件

Page 28: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 28

7.4 文件操作与文件流关闭磁盘文件:即解除该磁盘文件与文件流的关联。关闭文

件的成员函数:outfile.close ( );

Page 29: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 29

7.4 文件操作与文件流 对 ASCII 文件的操作:对文件的读写操作有两种方法:

用流插入运算符“ <<” 和流提取运算符“ >>” 输入输出标准类型数据; 用 put, get, getline 等成员函数进行字符的输入输出。下面举例说明。设有一个整数数组,含 10 个元素。从键盘输入

10 个整数,存储到磁盘文件 f1.dat 中。#include <iostream.h># include <fstream.h> // 程序中甬道 ofstream 文件流类,所以要包含此头文件int main( ){ int a[10]; ofstream outfile (“f1.dat”, ios::out); // 定义文件流对象,建立磁盘文件 f1.dat if (!outfile) // 如果建立文件失败,则返回 0 { cerr<<"open error!"<<endl; return 0; } cout<<"enter 10 inter numbers: "<<endl; for ( int i=0;i<10;i++) { cin>>a[i]; outfile<<a[i]<<“ ”; } // 向磁盘文件输出数据 outfile.close(); // 关闭磁盘文件 return 0;}

Page 30: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 30

7.4 文件操作与文件流又例,编写一个程序,将磁盘文件内容读入内存,然后输出到显示器。假设磁盘当前目录有有一文件 f1.dat ,其存储的数据为:

11 21 31 41 51 61 71 81 91 12 22 32 42 52 62 72 82 92

#include <iostream.h># include <fstream.h>void display_file(char *filename){ ifstream infile(filename, ios::nocreate); if (!infile) { cerr<<"open error!"<<endl; return ; } char ch; while(infile.get(ch)) cout.put(ch); cout<<endl; infile.close();}int main( ){ display_file("f1.dat"); return 0;}

Page 31: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 31

7.4 文件操作与文件流对二进制文件的操作:打开文件时,用 ios::binary 指定,

用成员函数 read 和 write读写文件。用 read 函数和 write 函数读写文件:调用的一般形式为:

istream & read (char *buffer, int len);ostream & write ( const char * buffer, int len );

指针 buffer 指向内存中一段存储空间, len 是要读写的字节数。调用方式:

a.write (p1, 50);b.read (p2, 30);

Page 32: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 32

7.4 文件操作与文件流示例:将一批数据以二进制形式存放在磁盘文件 f2.dat 中。

#include <iostream.h># include <fstream.h>struct student{ char name[10]; int num; int age; char sex;};int main(){ student stud[3]={"Li",1001,18,'f', "Fu",1002,19,'m',"Tan",1003,20,'f'}; ofstream outfile ("f2.dat", ios::binary); if (!outfile) { cerr<<"open error!"<<endl; return 0; } for (int i=0;i<3;i++) outfile.write((char *)&stud[i],sizeof(stud[i])); outfile.close(); return 0;}

Page 33: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 33

7.4 文件操作与文件流例:将刚才写入的二进制文件 d2.dat读入并显示在屏幕上。

#include <iostream.h>#include <fstream.h>#include <iomanip.h>struct student{ char name[10]; int num; int age; char sex;};int main(){ student stud[3]; int i; ifstream infile ("f2.dat", ios::binary); if (!infile) { cerr<<"open error!"<<endl; return 0; }

for (i=0;i<3;i++) infile.read((char *)&stud[i],sizeof(stud[i])); infile.close(); cout<<setw(10)<<"ÐÕÃû"

<<setw(7)<<"ѧºÅ" <<setw(6)<<"ÄêÁä" <<setw(4)<<"ÐÔ±ð"<<endl;

for (i=0;i<3;i++) {cout<<setw(10)<<stud[i].name<<" "; cout<<setw(6)<<stud[i].num<<" "; cout<<setw(4)<<stud[i].age<<" "; cout<<setw(2)<<stud[i].sex<<endl; } return 0;}

Page 34: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 34

7.4 文件操作与文件流 与文件指针有关的成员函数:磁盘文件有一个文件指针,指明当前读写位置。输入操作时,每读入一个字节,指针后移一个字节;输出操作时,每写入一个字节,指针就后移一个字节。二进制文件允许用户控制指针,使它按用户意图移动。

成员函数 作用gcount( ) 返回最后一次输入所读入的字节数tellg( ) 返回输入文件指针的当前位置seekg( 文件中的位置 ) 将输入文件指针移到指定位置seekg( 位移量 ,参照位置 )

以参照位置为基础移动若干字节tellp( ) 返回输出文件指针当前位置seekp( 文件中的位置 ) 将输出文件指针移到指定位置seekp( 位移量 ,参照位置 )

以参照位置为基础移动若干字节

Page 35: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 35

7.4 文件操作与文件流上表说明:

函数名末尾字符不是 p ,就是 g 。 P 意味 put , g 意味get

函数中“参照位置”是: ios::beg :文件开头 ios::cur :指针当前位置 ios::edn :文件末尾

举例:infile.seekg(100); // 输入文件的指针向前移到 100 字节处infile.seekg(-50,ios::cur) // 输入文件指针从当前位置后移 50 字节outfile.seekp(-75,ios::end) // 输出文件指针从文件尾后移 75 字节

Page 36: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 36

7.4 文件操作与文件流随机访问二进制文件:我们学了顺序读写文件的方法,对于

二进制文件,我们可以移动文件指针,随机访问文件中任一位置的数据,并修改文件中的内容。

示例:要求:打开一个可读写的二进制文件 file6.dat ;write( ) 函数向 fileb.dat 写入 5 个学生记录;使用 seekp( ) 函数移动指针分别读出第 5 个和第 2 个学

生的记录信息,显示在屏幕上。

Page 37: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 37

7.4 文件操作与文件流#include <iostream.h>#include <fstream.h>#include <stdlib.h>void main(){struct student {char name[10]; long number; double totalscord; }stu[5]={"Ma", 98001, 89.5, "Li", 98023, 82.9, "Go", 98045,90.2, "Hu", 98067, 92.1, "Yan", 98067, 79.5}; student S1; fstream fileb; fileb.open("file6.dat", ios::out|ios::in|

ios::binary); if(!fileb) { cout<<"file6.dat can't open.\n"; abort(); }

for(int i=0; i<5; i++) fileb.write((char *)&stu[i], sizeof(student)); fileb.seekp(sizeof(student)*4); // 移动指针到第

5 个记录的起始处 fileb.read((char *)&S1, sizeof(stu[i])); cout<<S1.name<<'\t‘ <<S1.number<<'\t‘ <<S1.totalscord; cout <<endl; fileb.seekp(sizeof(student)*1); // 移动指针到第

2 个记录的起始处fileb.read((char *)&S1, sizeof(stu[i])); cout<<S1.name<<'\t‘ <<S1.number<<'\t‘ <<S1.totalscord; cout <<endl; fileb.close();}

Page 38: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 38

7.5 字符串流字符串流的概念:文件流是以外存文件为输入输出对象的数

据流,而字符串流是将数据输出到内存中的字符数组,或从字符数组读入数据。字符串流也称内存流。

字符串流缓冲区:字符串流也有缓冲区。一开始,缓冲区为空。如果向字符数组存入数据,随着向流插入数据,流缓冲区

中的数据不断增加。当缓冲区满或遇到换行符,缓冲区内容变全部存入字符数组。

如果是从字符数组读数据,先将字符数组中的数据送到缓冲区,然后从缓冲区提取数据赋给有关变量。

Page 39: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 39

7.5 字符串流数据存入字符数组之前,先要将数据转换成 ASCII代

码,然后放入缓冲区,再从缓冲区送到字符数组。字符串流类的类型有:

Istrstream 类;Ostrstream 类;Strstream 类。

文件流类和字符串流类都是 ostream 类、 istream类和 iostream 类的派生类。

Page 40: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 40

7.5 字符串流向内存中的字符数组写入数据,和向文件写入数据一样。但有以下三点不同:输出时,数据不是流向外存文件,而是流向内存中的一个

存储空间;输入时,是从内存空间读取数据。严格地将,称为内存读写比较合适,但 C++ 采用了流输入输出机制,因此也用输入输出机制来表述读写操作。

字符串流关联的不是文件,而是内存中的一个字符数组,因此不需要打开和关闭文件。

每个文件都以文件结束符来结束,而字符串流多关联的字符数组中没有这种文件结束符。用户要自己指定一个特殊标志作为结束符。在向字符数组写入全部数据后要写入此字符。

Page 41: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 41

7.5 字符串流建立输出字符串流对象: ostrstream 类提供的构造函数原型为:

ostrstream :: ostrstream (char *buffer, int n, int mode=ios::out );

其中:buffer 是指向字符数组首元素的指针;n 为指定的流缓冲区大小,一般与字符数组大小相同;第三个参数可选,默认为 ios:;out 方式,可以用以下语句建立输出字符串流对象并与字符数组建立关联:

ostrstream strout (ch1,20);作用是建立输出字符串流对象 strout 与字符数组

ch1 关联,缓冲区大小为 20 。

Page 42: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 42

7.5 字符串流建立输入字符串流对象: istrstream 类提供两个带参数的构造函数,其原型为:

istrstream :: istrstream (char *buffer);istrstream :: istrstream (char *nuffer, int n);

其中:buffer 是指向字符串数组首元素的指针,用来初始化流

对象。可以用以下语句建立输入字符串流对象:istrstream strin (ch2, 20);

其作用是建立输入字符串流对象 strin ,缓冲区大小为 20 ,因此只将字符数组 ch2 中的前 20 个字符作为输入字符串流的内容。

Page 43: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 43

7.5 字符串流建立输入输出字符串流对象: strstream 类提供的构造函数原型为:

strstream :: strstream (char *buffer, int n, int mode );

可以用以下语句建立输入输出字符流对象:strstream strio (ch3, sizeof(ch3),ios::in|ios::out);

作用是建立输入输出字符串流对象,以字符数组 ch3 为输入输出对象,流缓冲区大小与 ch3 相同。

Page 44: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 44

7.5 字符串流例:将三个学生数据保存在字符数组中。

#include <iostream>#include <strstream>using namespace std;struct student{ int num; char name[10]; int score;};void main(){student stud[3]= {1001,"Li",78,1002,"Liu",98,1003,"Ge",90}; char c[50]; ostrstream strout (c,30); for (int i=0;i<3;i++) strout<<stud[i].num<<stud[i].name<<stud[i].score; strout<<ends; cout<<"array c:"<<c<<endl; }

Page 45: Object-Oriented Programming  in C++ 第七章 输入输出流

C++ 4- 45

习题:本章习题请上网查阅教学网页:

http://staff.ustc.edu.cn/~leeyi