输入和输出PPT课件_第1页
输入和输出PPT课件_第2页
输入和输出PPT课件_第3页
输入和输出PPT课件_第4页
输入和输出PPT课件_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 基本概念 C+I/O流库结构 一般的输入/输出 输入输出格式控制 文件的输入/输出 第1页/共118页2 C C的的I/OI/O库函数主要用来处理基本数据类型(字符、整型、浮点数等),使用参数表库函数主要用来处理基本数据类型(字符、整型、浮点数等),使用参数表进行数据传输,使用格式字符串指定数据类型和输入输出格式。它们在运行时对格进行数据传输,使用格式字符串指定数据类型和输入输出格式。它们在运行时对格式字符串进行语法分析,并据此对变量进行解释。例如:式字符串进行语法分析,并据此对变量进行解释。例如:printf(a=%dtb=%dta+b=%dn,a,b,a+b);printf(a=%dtb

2、=%dta+b=%dn,a,b,a+b);第2页/共118页3 C语言I/O库的缺点是:1 即使只使用了解释程序的一个功能,也要全部装载。如上面的例子,我们要装载整个包,包括解释浮点数和字符串那部分程序段,无法减少程序的长度。第3页/共118页4 C语言I/O库的缺点是:2 不能把自定义类型的数据作为一个整体进行输入和输出。第4页/共118页5 C语言I/O库的缺点是:3 对于C+来说,printf不能被扩展是它最大的缺点。我们不能通过重载函数对它进行扩展,因为重载函数要有不同类型的参数,而printf族函数把类型信息隐藏在可变参数表和格式字符串中。第5页/共118页6 iostream流库

3、的好处 1. iostream是通过类的继承,类成员函数的重载来实现的,利用类的可继承性和多态性,使iostream类库使用统一的函数接口操作标准I/O、文件、存储块等输入输出设备。第6页/共118页7 iostream流库 的好处 2. 通过函数重载,为每种内部数据类型定义了流输入输出函数,使得用户可以用相同的格式对各种数据类型进行操作,编译程序根据数据的类型自动选择相应的输入输出函数,不必将所有函数一并加载。第7页/共118页8 iostream流库 的好处 3. iostream拥有了很好的扩展性,用户通过重载还可以对自定义对象进行流的操作。因此,与标准C输入输出库的各种各样的函数相比,

4、输入输出流更容易、更安全、更有效。第8页/共118页9v在C+中,输入输出是通过流来完成的。输出操作将一个对象的状态转换成一个字符序列,输出到某个地方输入操作是从某个地方接收到一个字符序列,然后将其转换成一个对象的状态所要求的格式。v看起来很像数据在流动,于是把接收输出数据的地方叫做目标,把输入数据来自的地方叫做源。而输入和输出操作可以看成字符序列在源、目标以及对象之间的流动。vC+将与输入和输出有关的操作定义为一个类体系,放在一个系统库里,以备用户调用。这个执行输入和输出操作的类体系就叫做流类,提供这个流类实现的系统库就叫做流类库。第9页/共118页101 1基基 本本 概概 念念什么是流

5、是数据从源是数据从源( (数据的生产者数据的生产者) )到漏到漏( (数据的消费者数据的消费者) )的流动的流动. .是有向的数据流动的抽象描述,是数据流动的是有向的数据流动的抽象描述,是数据流动的渠道和方向,是程序与输入渠道和方向,是程序与输入/ /输出设备的连接桥输出设备的连接桥梁。梁。第10页/共118页11例: cin name; /从流对象(键盘)读数据放入变量中 cout my name is name ”) )操作;操作; ostream ostream - - 由由iosios派生,支持输出派生,支持输出( (插入插入“”) )操作;操作; iostream iostream

6、- - 由由istreamistream与与ostreamostream共同派生,支持输入和共同派生,支持输入和输出双向操作。输出双向操作。 第18页/共118页19系统还预定义好了系统还预定义好了4 4个流类的对象,供用户个流类的对象,供用户需要时使用,它们是:需要时使用,它们是: (1) streamstream类的对象,用来处理标准输入,类的对象,用来处理标准输入,即键盘输入。即键盘输入。(2) ostreamostream类的对象,用来处理标准输出,类的对象,用来处理标准输出,即屏幕输出。即屏幕输出。(3) ostreamostream类的对象,用来处理标准出错类的对象,用来处理标准出

7、错信息,它提供不带缓冲区的输出。信息,它提供不带缓冲区的输出。(4)ostreamostream类的对象,用来处理标准出错类的对象,用来处理标准出错信息,但它提供带缓冲区的输出。信息,但它提供带缓冲区的输出。 第19页/共118页20C+C+的文件流类系统的文件流类系统 在头文件在头文件“fstream.hfstream.h”中说明中说明( (预定义预定义) )了一批了一批文件流文件流类类,专用于,专用于磁盘文件磁盘文件: : ifstreamifstream - - 由由istreamistream派生,支持从磁盘文件中输入派生,支持从磁盘文件中输入( (读入读入) )数据;数据; ofst

8、reamofstream - - 由由ostreamostream派生,支持往磁盘文件中输出派生,支持往磁盘文件中输出( (写出写出) )数据;数据; fstreamfstream - - 由由iostreamiostream派生,支持对磁盘文件进行派生,支持对磁盘文件进行输入和输出数据的双向操作。输入和输出数据的双向操作。 C+C+中没有预定义的文件流中没有预定义的文件流( (类对象类对象) ),程序中用到的所,程序中用到的所有文件流类对象都要进行自定义。有文件流类对象都要进行自定义。第20页/共118页213 3一般输入和输出一般输入和输出v屏幕输出(写操作)v1. 使用预定义的插入符()

9、。v2. 使用成员函数get( )读一个字符。v3. 使用成员函数getline( )读一行字符。v4. 使用成员函数read( )读若干个字符。第21页/共118页22输入输出流的成员函数 ignore():跳过制定数量的字符; putback() peek() :返回输入流中的下一个字符,但不将其从输入流中删除; gcount():统计输入个数;第22页/共118页2389.比较cin和cin.get的输入#include const int SIZE =80;void main( ) char buffer1SIZE, buffer2SIZE; cout Enter a sentence

10、: buffer1; cout endl The string read with cin was : buffer1 endl; cin.get(buffer2,SIZE); cout The string read with cin.get was: buffer2 endl; 结果:Enter a sentence Test reading functions with cin and cin.get The string read win cin was: Test The string read cin.get was: reading functions with cin and

11、cin.get第23页/共118页2490.getline和write的应用#include const int SIZE =80;void main( ) char bufferSIZE; cout Enter a sentence: endl; cin.getline(buffer,SIZE); cout endl The string read was : buffer endl; cout.write(buffer, 8); cout x y; 输入为:10 20 不能输入为:10, 20 2. 类型的匹配问题:不同类型的变量一起输入时,系统除检 查是否有空白,还要检查输入数据与变量的

12、匹配问题。如: cin i x /i为整型,x为实型 若输入 56.79 32.85 结果为:i=56, x=0.79 而不是 i=56, x=32.85 3. 输入字符串时,字符串中不能有空格,一旦遇到空格,就 当着是本数据结束。如: cin str; 当输入为 We are students! 结果为 str=We, 而不是str=We are student! 第25页/共118页264 4格式化输入和输出格式化输入和输出控制输入/输出格式的目的 进行不同进制之间的转换:8进制、16进制等 精度的控制:小数点的位数等 输入/输出的宽度控制。如:是输出100,还是 100 格式之间的状态转

13、换 第26页/共118页27两种格式控制方法:两种格式控制方法: 使用ios类中的有关格式控制的成员函数 即由cin 或 cout 流对象来调用其成员函数 如:cout.width(4); cout.precision(5); 使用操作函数控制格式 不要前缀流对象,直接调用操作函数。可以直接 嵌入到输入/输出语句中。 cout setw(10) hex n endl;第27页/共118页28状态标志状态标志含义含义输入输入/输出输出skipws跳过输入中的空白跳过输入中的空白Inputleft左对齐输出左对齐输出Outputright右对齐输出右对齐输出Outputinternal在符号位和基

14、指示后填入字符在符号位和基指示后填入字符Outputdec转换为十进制转换为十进制Input/Outputoct转换为八进制转换为八进制Input/OutputHex转换为十六进制转换为十六进制Input/Outputshowbase在输出中显示基指示符在输出中显示基指示符Input/Outputshowpoing输出时显示小数点输出时显示小数点Outputuppercase输出十六进制时,相关符号大写输出十六进制时,相关符号大写Outputshowpos对正数显示对正数显示+号号Outputscientific科学表示法科学表示法OutputFixed定点形势显示浮点数定点形势显示浮点数Ou

15、tputUintbuf在输出操作后立即刷新所有流在输出操作后立即刷新所有流Outputstdio在输出操作后刷新在输出操作后刷新stdio和和stderrOutput格式控制枚举量表 第28页/共118页291.设置状态标志 Long ios:setf(long flag) 如: cout.setf(ios:showpos|ios:scientific); Cout123 123.23 ; +123 +1.232300e+2;第29页/共118页30 2. 清除状态标志 long ios:unsetf(long flags) 3. 取状态标志 long ios:flag(); long ios

16、:flags(long flags);无参函数返回当前设置;有参函数,返回当前设置,并按flags的值进行新的设置。 第30页/共118页314. 设置域宽,填充字符,设置精度 int ios:width(int len); int ios:width( ); char ios : fill(char ch); int ios:precision(int num);第31页/共118页32 # include 66.cpp void main() cout.setf(ios:showpos); cout.setf(ios:scientific); cout123“ ” 123.23“n”; c

17、out.precision(2); cout.width(10); cout123“ ” 123.23“n”; cout.fill(#); cout.width(10); cout123“ ” 123.23“n”; 第32页/共118页33 23“ ” 123.23“n”; 输出为 +123 +1.232300e+002 +123 +1.23e+002 #+123 +1.23e+02第33页/共118页34C+C+提供了大量的用于格式化输入和输出提供了大量的用于格式化输入和输出的的流操纵算子流操纵算子( (操作函数操作函数) ),如:,如: (1) setbase (int n) 设置数制转换

18、基数为设置数制转换基数为n(n为为0, 8, 10, 16),其中,其中0表示使用缺省基数表示使用缺省基数(10)。 (2) setfill(char) /设置填充字符设置填充字符 (3) /设置浮点数输出的精确位数设置浮点数输出的精确位数 (4) /设置输出数据的宽度设置输出数据的宽度 第34页/共118页351.1.为了调整输出,可以通过在流中放入为了调整输出,可以通过在流中放入setwsetw操纵算子或调用操纵算子或调用width( )width( )成员函数为每个成员函数为每个输出项(输出项(itemitem)指定输出宽度。)指定输出宽度。 汇总第35页/共118页36使用使用widt

19、h( )控制输出宽度控制输出宽度 例1:第36页/共118页37从程序的输出结果可以看到,在少于从程序的输出结果可以看到,在少于1010个个字符宽的数值前加入了引导空格。字符宽的数值前加入了引导空格。 第37页/共118页38例7:#include#includevoid main( ) int x=12345; /缺省格式与右端对齐 cout Default is on right: endl setw(10) x endl endl; /调整到与左端对齐 cout.setf(ios:left); cout setw(10) x endl endl; /再次调整到与右端对齐 cout.uns

20、etf(ios:left); cout setw(10) x endl; 93. 打印宽度的控制 结果:Default is on right: 1234512345 12345第38页/共118页392. 2. 空格是缺省的填充符,当输出的数据不能空格是缺省的填充符,当输出的数据不能充满指定的宽度时,系统会自动以空格填充满指定的宽度时,系统会自动以空格填充,也可以指定用别的字符来填充。使用充,也可以指定用别的字符来填充。使用fill( )fill( )成员函数可以为已经指定宽度的成员函数可以为已经指定宽度的域设置填充字符的值。域设置填充字符的值。 第39页/共118页40#include#i

21、ncludevoid main( ) int x=12345; /缺省格式与右端对齐 cout Default is on right: endl setw(10) x endl endl; /调整到与右端对齐 cout.setf(ios:right); cout.fill(* ); cout setw(10) x endl endl; /再次调整到与左端对齐 cout.setf(ios:left, ios:adjustfield); cout setw(10) setfill( % ) x endl; 94.格式输出中空白的填充 结果:Default is on right: 12345*1

22、234512345%第40页/共118页413. 3. 如果要为同一行输出的不同数据项分别如果要为同一行输出的不同数据项分别指定宽度,可以使用指定宽度,可以使用setwsetw操纵算子。操纵算子。 第41页/共118页42分析下列程序的运行结果分析下列程序的运行结果 65.cpp 例3第42页/共118页43第43页/共118页44(1) width( )(1) width( )成员函数在成员函数在iostream.hiostream.h中说中说明了。如果使用明了。如果使用setwsetw或任何其它操纵算或任何其它操纵算子,就必须包含头文件子,就必须包含头文件iomanip.h iomanip

23、.h (2) setw(2) setw仅影响紧随其后的域,在一个域仅影响紧随其后的域,在一个域输出完后,域宽恢复成它的缺省值(必输出完后,域宽恢复成它的缺省值(必要的宽度)。要的宽度)。 注意第44页/共118页45输出流缺省为右对齐文本,如果要改输出流缺省为右对齐文本,如果要改变 这 种 对 齐 方 式 , 可 用 带 参 数 的变 这 种 对 齐 方 式 , 可 用 带 参 数 的setiosflagssetiosflags操纵算子。操纵算子。 第45页/共118页46使用使用setiosflags操纵算子设置对齐方式操纵算子设置对齐方式 67.cpp 例4第46页/共118页47 在 这

24、 个 程 序 中 , 通 过 使 用 带 参 数 的在 这 个 程 序 中 , 通 过 使 用 带 参 数 的setiosflagssetiosflags操纵算子来设置左对齐和右对齐。当操纵算子来设置左对齐和右对齐。当不需要左对齐或右对齐时,可以用不需要左对齐或右对齐时,可以用resetiosflagsresetiosflags操纵算子关闭左对齐或右对齐标志。操纵算子关闭左对齐或右对齐标志。setiosflagssetiosflags不同于不同于setwsetw,它的影响是持久的。,它的影响是持久的。 第47页/共118页48写出下列程序的运行结果 68.cpp 例5第48页/共118页49第

25、49页/共118页50浮点数的输出精度,不同的系统有不同的浮点数的输出精度,不同的系统有不同的规定。可使用规定。可使用setiosflags操纵算子,该操纵算子操纵算子,该操纵算子有两个标志有两个标志ios:fixed和和ios:scientific,可以改,可以改变精度。变精度。 还有还有setprecision操纵算子(原型为操纵算子(原型为setprecision (int i)),),i表示在提取一个浮点数表示在提取一个浮点数时,小数点后最多能提取的小数位数。时,小数点后最多能提取的小数位数。 第50页/共118页51控制输出精度 69.cpp 例6第51页/共118页52如果改变如果

26、改变ios:fixedios:fixed为为ios:scientificios:scientific,该,该程序的输出结果变为科学计数程序的输出结果变为科学计数 可以用可以用resetiosflagsresetiosflags操纵符清除这些标志。操纵符清除这些标志。 第52页/共118页53setiosflagssetiosflags的标志位的标志位decdec,octoct和和hexhex设置输设置输入和输出的缺省进制。入和输出的缺省进制。例如:若将某数以十六制输出,可将例如:若将某数以十六制输出,可将hexhex标志位插标志位插入到输出流中。入到输出流中。如如:coutsetiosflag

27、s(ios:hex)i:coutsetiosflags(ios:hex)i。如果。如果ios:uppereaseios:upperease标志已清除,该数值以小写字标志已清除,该数值以小写字母母a a到到f f数值显示,否则以大写字母数值显示,否则以大写字母A A到到Z Z显示。显示。 第53页/共118页54上面使用标志位比较麻烦,为此,上面使用标志位比较麻烦,为此,C+I/OC+I/O流类库还提供了流类库还提供了iosios标志位来达到此目的,如上标志位来达到此目的,如上例可写为:例可写为:couthexicouthexi。其它的。其它的iosios标志位还标志位还有有dex(dex(十进

28、制十进制) )和和oct(oct(八进制八进制) )等。等。 浮点型数没有八进制和十六进制表示。浮点型数没有八进制和十六进制表示。 另外,使用另外,使用iosios标志位要用头文件标志位要用头文件iomanip.hiomanip.h。 第54页/共118页55写出下面程序的运行结果 例7第55页/共118页56用户自定义的流操纵算子#include ostream & money(ostream & output) return output“n$”; void main() float owed=1.35, earned=23.1; coutmoneyowedmoneyear

29、ned; 产生的输出为: $1.35 $23.170.cpp第56页/共118页57iostreamiostream之所以具有可扩展性,是因为它不之所以具有可扩展性,是因为它不仅可以对内部数据类型进行插入和抽取,而且用仅可以对内部数据类型进行插入和抽取,而且用户可以根据需要,重载插入和抽取运算符,实现户可以根据需要,重载插入和抽取运算符,实现对自定义数据类型的插入和抽取。对自定义数据类型的插入和抽取。 使用户自定义类型数据的输入使用户自定义类型数据的输入/ /输出和系统输出和系统预定义类型数据的输入预定义类型数据的输入/ /输出一样简单输出一样简单, ,方便方便. .5 5第57页/共118页

30、58自定义输入/输出类型的目的 使用户能使用简洁、有效、便利的方法输入/输出特殊结构的数据,如:电话号码三维点的坐标:(1,2,3)实现自定义输入/输出类型的手段 通过对输入 ()和输出()运算符的重载,定义特殊的输入/输出结构v71.cpp第58页/共118页59例:圆的相关数据的输出#include class Circle friend ostream &operator (ostream &, const Circle &); /重载输出运算符public: Circle(float a, float b, float c) radiu

31、s=a; x=b; y=c;private: float radius; /圆的半径 float x, y; /圆心的坐标;例:圆的相关数据的输出 86.cpp第59页/共118页60ostream &operator (ostream &output, const Circle &C) output Center= C.x , C.y ; endl Radius = C.radius endl; return output;void main( ) Circle C(2.5, 5, 10); cout C; 结果: Center=5, 10; Radius = 2.5

32、第60页/共118页61例:电话号码的输入/输出 85.cpp#include class PhoneNumber friend ostream &operator (istream &, PhoneNumber &); /重载输入运算符 private: char areaCode4, exg4, line5; ;第61页/共118页62ostream &operator (ostream &output, const PhoneNumber &num) output num.areaCode - num.exg - line; return

33、output; / 此语句的目的:实现cout a b (istream &input, PhoneNumber &num) input.getline(num.areaCode,4); /读入地区号 input.ignore( ); /跳过横线- input.getline(num.exg,4); input.getline(num.line,5); return input; / 此语句的目的:实现cin a b c; 第62页/共118页63void main( ) PhoneNumber phone; /定义一个对象实例phone cout Enter a phone

34、number in the form phone; /应用重载的输入运算符读入自定义的类型数据 cout The phone number entered was : endl phone endl; /应用重载的输出运算符写出自定义的类型数据 结果: Enter a phone number in the formThe phone number entered was : 025-349-2470第63页/共118页64存储在变量和数组中的数据是临时的,这些存储在变量和数组中的数据是临时的,这些数据在程序运行结束

35、后都会消失。文件用来永久数据在程序运行结束后都会消失。文件用来永久地保存大量的数据。地保存大量的数据。文件是文件是C+C+程序设计中的一个重要概念,所程序设计中的一个重要概念,所谓谓“文件文件”是指存储在外部介质上的数据集合是指存储在外部介质上的数据集合(又称为磁盘文件)。操作系统是以文件为单位(又称为磁盘文件)。操作系统是以文件为单位对数据进行管理的。对数据进行管理的。 6 6第64页/共118页65 从逻辑概念上说,磁盘文件与前面讨论的标准设备(键盘、显示器)文件没有本质的区别,标准流cin,cout 等与文件流大致相当。不过,从具体细节上,还是有些区别。因此,C+的I/O 系统在基本类i

36、os,istream,ostream 等等的定义基础上,又为磁盘文件的I/O 派生出一个专用的I/O 流类系统文件输入/输出的过程第65页/共118页66文件I/O流库类层次结构第66页/共118页671.C+1.C+把文件看作是字符(字节)的序列,即由把文件看作是字符(字节)的序列,即由一个一个字符数据顺序组成的。根据数据的组一个一个字符数据顺序组成的。根据数据的组织形式,可分为织形式,可分为ASCIIASCII文件文件和和二进制文件二进制文件。 第67页/共118页68第68页/共118页69缓冲文件系统缓冲文件系统:系统自动地在内存区为每一系统自动地在内存区为每一个正在使用的文件开辟一个

37、缓冲区。从内存向磁个正在使用的文件开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向内存读冲区后才一起送到磁盘去。如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量)。地将数据送到程序数据区(给程序变量)。 用缓冲文件系统进行的输入输出又称为高级用缓冲文件系统进行的输入输出又称为高级( (或高层或高层) )磁盘输入输出。磁盘输入输出

38、。 2. 2. 文件的处理方法文件的处理方法第69页/共118页703. C3. C语言对文件的操作都是通过文件处理函数实语言对文件的操作都是通过文件处理函数实现的。用文件处理函数存取文件的方式有两现的。用文件处理函数存取文件的方式有两种,一种是顺序存取,另一种是随机存取。种,一种是顺序存取,另一种是随机存取。 在在C C语言中对文件的存取是以字符为单语言中对文件的存取是以字符为单位的。输入输出的数据流的开始和结束仅受程序位的。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制。这控制而不受物理符号(如回车换行符)控制。这种文件称为流式文件。种文件称为流式文件。 第70

39、页/共118页71 为了使用文件流,需要在程序中包含fstream.h,在这个头文件中定义了ifstream :支持(提供)从本流类(对象)所对应的磁盘文件中输入(读入)数据;ofstream:支持(提供)往本流类(对象)所对应的磁盘文件中输出(写出)数据;fstream:支持(提供)对本流类(对象)所对应的磁盘文件进行输入和输出数据的双向操作。注意,C+中没有预定义的文件流(类对象),即是说,程序中用到的所有文件流类对象都要进行自定义(规定对象名及打开方式,并将该流类对象与一个具体的磁盘文件联系起来等)。第71页/共118页72 (1) 在程序中包含头文件 fstream.h (2) 定义流

40、对象,如:ifstream myin; ofstream myout;(3) 使用open函数打开文件v如果文件不存在,则建立该文件;如果磁盘上已存在该文件,则打开该文件;(4) 进行文件的读/写操作v在建立(或打开)的文件上执行所要求的输入/输出操作。一般来说,在内存与外设的数据传输中,由内存到外设称为输出或写,反之则称为输入或读; (5) 使用close函数关闭文件C+中进行文件操作的一般步骤 第72页/共118页73 在C+中,打开一个文件就是将这个文件与一个流建立关联;关闭一个文件就是取消这种关联。 open()函数的原型在fstream.h中定义。另外,在fstream、ifstre

41、am和ofstream流类中均有定义。其原型为:void open(char *filename,int mod,int access);其中第一个参数是用来传递文件名;第二个参数的值决定文件的使用方式;第三个参数的值决定文件的访问方式。 第73页/共118页74磁盘文件的打开和关闭使用磁盘文件的打开和关闭使用fstreamfstream类类中所定义的成员函数中所定义的成员函数open( )open( )和和close( )close( )。 第74页/共118页75在打开文件前,先说明一个在打开文件前,先说明一个fstreamfstream类的对象,类的对象,再使用成员函数再使用成员函数op

42、en( )open( )打开指定的文件,文件被打开指定的文件,文件被打开后,才可以对文件进行读写操作。如:以输打开后,才可以对文件进行读写操作。如:以输出方式打开一个文件的方法如下:出方式打开一个文件的方法如下: 1. 1. 打开文件打开文件第75页/共118页76方法一: 定义流对象与打开文件由两条语句完成 ofstream myout; /定义流对象 myout.open(“myfile ”, ios:out, 0); /打开文件 myout “Write some words in myfile ”; /向文件写数据 定义流对象与打开文件 方法二: 定义流对象与打开文件由一条语句完成 o

43、fstream myout(“myfile ”, ios:out, 0); /定义流对象和打开文件 myout Write some words in myfile ; /向文件写数据第76页/共118页77 定义流对象与打开文件:注意点 ofstream myout(“myfile ”, ios:out, 0); /定义流对象和打开文件 myout Write some words in myfile ; /向文件写数据 (1) myfile 是外部文件名,即一个具体的要写入数据的文件。 (2) myout 是程序中使用的流对象名,是外部文件的逻辑名。 其中: ios:out 表示是输出文件

44、。 输入文件可定义为: ifstream myin(“myfile”, ios:in, 0); 0 表示为一般文件。其他文件类型有: 0: 一般文件 1: 只读文件 4: 系统文件第77页/共118页78下表中给出了ios类中提供的文件访问方式常量: 以输入以输入(读读)方式打开文件方式打开文件以输出以输出(写写)方式打开文件方式打开文件以输出追加方式打开文件以输出追加方式打开文件打开一个现存文件打开一个现存文件(用于输入或用于输入或输出输出)并且文件读写位置指针位并且文件读写位置指针位于文件尾于文件尾以读和写方式打开文件以读和写方式打开文件以二进制写方式打开文件以二进制写方式打开文件以二进制

45、读方式打开文件以二进制读方式打开文件第78页/共118页79 第79页/共118页80第80页/共118页81当结束一个文件的操作后,要及时将该文件当结束一个文件的操作后,要及时将该文件关闭。关闭文件时,调用成员函数关闭。关闭文件时,调用成员函数close ( )close ( )。 例如:关闭文件流例如:关闭文件流outfileoutfile所标识的文件,使所标识的文件,使用下面格式:用下面格式: 于是文件流于是文件流outfileoutfile被关闭,由它所标识的文被关闭,由它所标识的文件被送入磁盘中。件被送入磁盘中。 2.2.关闭文件关闭文件第81页/共118页82 例cpp89:把一个

46、整数、一个符点数和一个字符串写入文件 test(修改版) #include#include /包含文件输出流void main( ) ofstream myout(test); /定义用户自己的流对象myout,以及文件名test if( !myout) /判断是否可以打开文件,myout=0为不可以,myout=1为可以 cout cannot open file: test; myout 10 123.45 objectn; /向文件写数据 myout.close( ); /关闭文件第82页/共118页83 例cpp90:从文件test中读入一个整数、一个符点数、一个字符和一个字符串 #i

47、nclude#include /包含文件输出流void main( ) char ch; int a; float b; char *str=new char80; ifstream myin(test); /定义用户自己的流对象myin,以及文件名test if( !myin) /判断是否可以打开文件,myin=0为不可以,myin=1为可以 cout a b ch str; /从文件中读数据 cout a b ch str; myin.close( ); /关闭文件第83页/共118页84分析下例程序的运行结果 72.cpp 例1第84页/共118页85运行结果: 120,mali 第85

48、页/共118页86对文本文件进行读写操作时,首先要对文本文件进行读写操作时,首先要打开文件,然后再对打开文件时设定的文打开文件,然后再对打开文件时设定的文件流进行操作。件流进行操作。 第86页/共118页87把文本写入指定的文件中去73.cpp 例2第87页/共118页88第88页/共118页89使用使用get( )get( )和和put( )put( )函数读写文本文件函数读写文本文件 (75.cpp) (75.cpp) 例4第89页/共118页90第90页/共118页91第91页/共118页92第92页/共118页93 例:将文件 file_from 的内容拷贝到文件 file_to 中

49、87.cpp #include#include /包含文件输出流void main( ) char ch; ifstream myin(file_from); /定义用户自己的流对象myin,以及文件名file_from if( !myin) /判断是否可以打开文件,myin=0为不可以,myin=1为可以 cout cannot open file: file_from; ofstream myout(file_to); /定义用户自己的流对象myout,以及文件名file_to if( !myout) /判断是否可以打开文件,myout=0为不可以,myout=1为可以 cout 运算符读

50、取文本文件时,会发生一运算符读取文本文件时,会发生一些字符转换,空白字符被忽略。如果想要阻止进些字符转换,空白字符被忽略。如果想要阻止进行字符转换,必须打开一个以二进制方式访问的行字符转换,必须打开一个以二进制方式访问的文件。文件。第94页/共118页95 通常使用通常使用read与与write对二进制文件对二进制文件(binary file)进行读写。进行读写。ostream& write( const char* pch, int nCount ); 功能:将功能:将pch缓冲区中的前缓冲区中的前nCount个字符写出到个字符写出到某个文件中。某个文件中。istream&

51、read( char* pch, int nCount ); 功能:从某个文件中读入功能:从某个文件中读入nCount个字符放入个字符放入pch缓冲区中(若读至文件结束尚不足缓冲区中(若读至文件结束尚不足nCount个个字符时,也将立即结束本次读取过程)。字符时,也将立即结束本次读取过程)。 注意:使用注意:使用write与与read进行数据读写时,不进行数据读写时,不必要在数据间再额外必要在数据间再额外“插入插入”分割符,这是因为分割符,这是因为它们都要求提供第二实参来指定读写长度。它们都要求提供第二实参来指定读写长度。第95页/共118页96写出程序的运行结果 例cpp91第96页/共11

52、8页97第97页/共118页98第98页/共118页99第99页/共118页100 对对text文件与文件与binary文件的一般使用示例文件的一般使用示例 * 以以text形式存储形式存储,优点优点是具有较高的兼容性。是具有较高的兼容性。缺点缺点是存储一批纯数值信息是存储一批纯数值信息时,要在数据之间人为地添加分割符;输入输出过程中,系统要对内外存的数据时,要在数据之间人为地添加分割符;输入输出过程中,系统要对内外存的数据格式进行相应转换;另外格式进行相应转换;另外text文件不便于对数据实行随机访问。文件不便于对数据实行随机访问。第100页/共118页101 * * 以以binarybin

53、ary形式存储形式存储,优点优点是便于对数据实行随是便于对数据实行随机访问(每一同类型数据所占磁盘空间的大小均相同,机访问(每一同类型数据所占磁盘空间的大小均相同,不必在数据之间人为地添加分割符);输入输出过程中,不必在数据之间人为地添加分割符);输入输出过程中,系统不对数据进行任何转换。系统不对数据进行任何转换。缺点缺点是兼容性低。是兼容性低。 注:由程序员决定将数据存储为注:由程序员决定将数据存储为texttext文件或者文件或者binarybinary文件两种形式之一。文件两种形式之一。 缺省打开方式时,默认为缺省打开方式时,默认为texttext文件形式。若欲使用文件形式。若欲使用bi

54、narybinary文件形式,要将打开方式设为文件形式,要将打开方式设为“ios:binaryios:binary”。 通常将纯文本信息(如字符串)以通常将纯文本信息(如字符串)以texttext文件形式存文件形式存储,而将数值信息以储,而将数值信息以binarybinary文件形式存储。文件形式存储。 第101页/共118页102 1. 1. 示例示例1 - 1 - 对两种文件进行操作对两种文件进行操作 将将a a数组中准备好的数组中准备好的8 8个个intint型数据,分别通过算符型数据,分别通过算符“”依次写出到依次写出到texttext文件文件ft.txtft.txt之中(注意各数据在

55、之中(注意各数据在文件中文件中“长短长短”不一,且数据间必须加入分割符)。而不一,且数据间必须加入分割符)。而且还通过使用类成员函数且还通过使用类成员函数writewrite将这相同的将这相同的8 8个个intint型数型数据依次写出到据依次写出到binarybinary文件文件fb.binfb.bin之中(注意各数据在文之中(注意各数据在文件中件中“长短长短”相同,且数据间不需要加入分割符)。相同,且数据间不需要加入分割符)。 另外,程序中通过使用无参的成员函数另外,程序中通过使用无参的成员函数“tellp()tellp()”来获取当前已写出到各文件的位置信息,以确认每一数来获取当前已写出到

56、各文件的位置信息,以确认每一数据在文件中所占的字节数。据在文件中所占的字节数。 ostream:tellpostream:tellp之功能为:获取并返回之功能为:获取并返回“输出指输出指针针”的当前位置值(从文件首到当前位置的字节数)。的当前位置值(从文件首到当前位置的字节数)。 第102页/共118页103 /cpp92#include void main() int a8=0,1,-1,1234567890; for(int i=4; i8; i+) ai=876543210+i-4; /均由均由9位数字组成,在位数字组成,在text文件中所占字节数也为文件中所占字节数也为9 ofstre

57、am ft(ft.txt); ofstream fb(fb.bin, ios:binary); for(i=0; i8; i+) ftai ;/数据间需要添加分割符数据间需要添加分割符 fb.write(char*)(&ai), sizeof(ai); /数据间不需数据间不需分割符分割符 coutft.tellp()=ft.tellp(), ; /当前当前ft文件文件位置位置 coutfb.tellp()=fb.tellp()endl; /当前当前fb文件位文件位置置 ft.close(); fb.close(); 第103页/共118页104 程序执行后的输出结果如下:程序执行后的输

58、出结果如下:ft.tellp()=2, fb.tellp()=4ft.tellp()=4, fb.tellp()=8ft.tellp()=7, fb.tellp()=12ft.tellp()=18, fb.tellp()=16ft.tellp()=28, fb.tellp()=20ft.tellp()=38, fb.tellp()=24ft.tellp()=48, fb.tellp()=28ft.tellp()=58, fb.tellp()=32第104页/共118页105 *2. 示例示例2 - 使用使用read与与write对对text文件进行操作时可能出文件进行操作时可能出错错 评注:评

59、注: (1)通常使用通常使用read与与write对二进制文件进行操作,但若非要使用对二进制文件进行操作,但若非要使用它们对文本文件进行操作时,系统在它们对文本文件进行操作时,系统在write时有可能多写出了一些东西时有可能多写出了一些东西(如,回车换行符号等)。这样将导致(如,回车换行符号等)。这样将导致read时产生错误。时产生错误。 (2)read与与write功能的进一步解释:功能的进一步解释: istream:read Extracts bytes from the stream until the limit nCount is reached or until the end o

60、f file is reached. The read function is useful for binary stream input. ostream:write Inserts a specified number of bytes from a buffer into the stream. If the underlying file was opened in text mode, additional carriage return characters may be inserted. The write function is useful for binary stream output. 第105页/共118页106Cpp93 Cpp93 采用binarybinary文件形式对结构体 数据进行存储与读写处理 从键盘读入多个结构数据从键盘读入多个结构数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论