第10章 C++语言的输入及输出_第1页
第10章 C++语言的输入及输出_第2页
第10章 C++语言的输入及输出_第3页
第10章 C++语言的输入及输出_第4页
第10章 C++语言的输入及输出_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

1、1第第10章章 C+语言的输入和输出语言的输入和输出本章重点:本章重点:vC+的流类库的流类库v预定义类型的输入与输出预定义类型的输入与输出v文件的输入与输出文件的输入与输出2v 在程序设计中,数据输入在程序设计中,数据输入/ /输出(输出(I/OI/O)操操作是必不可少的,作是必不可少的,C+C+的数据输入的数据输入/ /输出操输出操作是通过作是通过来实现的。来实现的。v C+C+支持两个完备的支持两个完备的I/OI/O系统:一个是从系统:一个是从C C继承而来的系统,另一个是继承而来的系统,另一个是C+C+定义的面定义的面向对象的向对象的I/OI/O系统。系统。3vC+C+的流类比的流类比

2、C C的输入输出函数具有更大的优越的输入输出函数具有更大的优越性。性。 首先它是首先它是类型安全类型安全的,可以防止用户输出数据与类的,可以防止用户输出数据与类型不一致的错误。型不一致的错误。 另外,另外,C+C+中可以重载运算符中可以重载运算符“”“”和和“”“”“”和和“”“”“”和和“”“ cin变量;变量; / /输入输入 cout cout( cin.operator(变量变量) ); cout. operator( cout. operator(常量或变量常量或变量) );1210.2.2 格式化输入输出格式化输入输出 C+提供了两种格式的控制方法:提供了两种格式的控制方法:v一种

3、是使用一种是使用iosios类中的有关格式控制的类中的有关格式控制的成员函数成员函数进行格式控制;进行格式控制;v另一种是使用另一种是使用称为操作符的特殊类型函数称为操作符的特殊类型函数进行进行格式控制。格式控制。 下面介绍这两种格式控制的方法。下面介绍这两种格式控制的方法。131 1 用用ios类的成员函数进行格式控制类的成员函数进行格式控制 表表10.2 控制输入输出格式的成员函数控制输入输出格式的成员函数函数原型函数原型功能功能long ios:setf(long flags);Long ios:unsetf(long flags);long ios:flags();long ios:

4、flags(long flags);int ios: width();int ios:width(int w);int ios:precision(int p);char ios:fill();char ios:fill(char ch);设置状态标志设置状态标志flags清楚状态标志,并返回前状态标志清楚状态标志,并返回前状态标志测试状态标志测试状态标志设置标志设置标志flags, 并返回前状态标志并返回前状态标志返回当前的宽度设置值返回当前的宽度设置值设置域宽设置域宽w,返回以前的设置返回以前的设置设置小数位数设置小数位数p,返回以前的小数位数返回以前的小数位数返回当前的填充字符返回当前的

5、填充字符设置填充字符设置填充字符ch,返回当前的填充字符返回当前的填充字符14下面分别介绍这些成员函数的使用方法;下面分别介绍这些成员函数的使用方法; (1 1)设置状态标志:)设置状态标志: 是将某一状态标志位置是将某一状态标志位置“1”“1”,可使用,可使用setf()setf()函数,其函数,其一般格式为一般格式为 long ios: : setf(long flags) long ios: : setf(long flags) 使用时,其一般的调用格式为:使用时,其一般的调用格式为: 流对象流对象. .setf(ios:setf(ios:状态标志状态标志) );例如:例如:istrea

6、m isobj;istream isobj;ostream osobj;ostream osobj;isobj.setf(ios:skipws); /isobj.setf(ios:skipws); /跳过输入中的空白跳过输入中的空白osobj.setf(ios:left); /osobj.setf(ios:left); /设置输出左对齐设置输出左对齐15【例【例10.1】设置状态标志函数的使用。】设置状态标志函数的使用。 /* 10_01.cpp */#includeusing namespace std;int main()cout.setf(ios:showpos|ios:scientif

7、ic);cout567” ”567.89endl;return 0;16+567 +5.678900e+002v注意:要设置多项标志时,中间用或运算符注意:要设置多项标志时,中间用或运算符“|”“|”分隔,分隔,例如:例如: cout.setf(ios:showpos|ios:dec|ios:cientific);程序的运行结果为:程序的运行结果为:17(2)清除状态标志:是将某一状态标志位置清除状态标志:是将某一状态标志位置“0”“0”,可使用,可使用unsef()unsef()函数,它的一般格式为:函数,它的一般格式为: long ios:unsef(long flags) long io

8、s:unsef(long flags)使用时的调用格式与使用时的调用格式与setf()setf()相同。相同。 18(3 3)取状态标志:取一个状态标志,可使用)取状态标志:取一个状态标志,可使用flags()flags()函数。函数。flags()flags()函数有不带参数与带参数两种形式。函数有不带参数与带参数两种形式。其一般格式为:其一般格式为: long ios:flags(); long ios:flags(); long ios:flags(long flag); long ios:flags(long flag);v前者用于返回当前的状态标志字(即前者用于返回当前的状态标志字(

9、即x_flagsx_flags的值);的值);v后者将状态标志字设置为后者将状态标志字设置为flagflag,并返回设置前的状态标并返回设置前的状态标志字。志字。vflags()flags()函数与函数与setf()setf()函数的差别在于:函数的差别在于:setf()setf()函数是函数是在原有的基础上在原有的基础上追加追加设定,而设定,而flags()flags()函数是用新设定函数是用新设定覆盖覆盖以前的状态标志字。以前的状态标志字。19(4 4)设置域宽:域宽主要用来控制输出,在)设置域宽:域宽主要用来控制输出,在iosios类中域宽存放类中域宽存放在数据成员在数据成员int x_

10、widthint x_width中。中。设置域宽的成员函数有两个,其一般格式为:设置域宽的成员函数有两个,其一般格式为: int ios:width(); int ios:width(); int ios:width(int w); int ios:width(int w);v前者用来返回当前的域宽值;前者用来返回当前的域宽值;v后者用来设置域宽,并返回原来的域宽。后者用来设置域宽,并返回原来的域宽。v注意注意,所设置的域宽,所设置的域宽仅对下一个流输出操作有效仅对下一个流输出操作有效,当一次,当一次输出操作完成之后,域宽又恢复为输出操作完成之后,域宽又恢复为0 0。20(5 5)填充字符:填

11、充字符的作用是,当输出值不满域宽时)填充字符:填充字符的作用是,当输出值不满域宽时用填充字符来填充,用填充字符来填充,缺省情况下填充字符为空格缺省情况下填充字符为空格。v所以在使用填充字符函数时,必须与所以在使用填充字符函数时,必须与width()width()函数相配函数相配合,否则就没有意义。合,否则就没有意义。v在在iosios类中用数据成员类中用数据成员x_fillx_fill来存放填充的字符。填充来存放填充的字符。填充字符的成员函数有两个,其一般形式为:字符的成员函数有两个,其一般形式为: char ios: : fill( ); char ios: : fill( ); char

12、ios: : fill(char ch); char ios: : fill(char ch);v前者用来返回数据填充字符,后者用前者用来返回数据填充字符,后者用chch重新设置填充字重新设置填充字符,并返回设置前的填充字符。符,并返回设置前的填充字符。 21( 6 6 ) 设 置 显 示 的 精 度 : 在) 设 置 显 示 的 精 度 : 在 i o si o s 类 中 用 数 据 成 员类 中 用 数 据 成 员 i n t i n t x_precisionx_precision来存放浮点数的输出显示精度。设置现实来存放浮点数的输出显示精度。设置现实的精度的成员函数的一般格式为:的精

13、度的成员函数的一般格式为: int ios: : precision(int p);int ios: : precision(int p);v此函数用来重新设置浮点数所需小数的位数,并返回设此函数用来重新设置浮点数所需小数的位数,并返回设置前的小数点后的位数。置前的小数点后的位数。 22【例【例10.2】 成员函数进行格式控制。成员函数进行格式控制。 /* 10_02.cpp */# includeusing namespace std;int main( ) cout”x_width=”cout.width( )endl;cout”x_fill=”cout.fill ( )endl;cout

14、”x_precision=”cout.precision( )endl;cout123” ”123.45678endl;cout”_n”;cout”* x_width=10,x_fill=, x_precision=4 *n”;cout.width(10);cout.precision(4);cout123” ”123.45678” ”234.567endl;x_width=0;x_fill=x_precision=0; 123 123.45678_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * x_width=10, x_fill= , x_precisio

15、n=4 * 123 123.4568 234.56723cout”x_width=”cout.width( )endl;cout”x_fill=”cout.fill ( )endl;cout”x_precision=”cout.precision( )endl;cout”_n”;cout”* x_width=10,x_fill=&, x_precision=4 *n”;cout.fill(&);cout.width(10);cout123” ”123.45678endl;cout.setf(ios: : left);cout.width(10);cout123” ”123.45

16、678endl;cout”x_width=”cout.width( )endl;cout”x_fill=”cout.fill ( )endl;cout”x_precision=”cout.precision( )endl;return 0;x_width=0 x_fill=x_precision=424x_width=0;x_fill=x_precision=0; 123 123.45678_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * x_width=10, x_fill= , x_precision=4 * 123 123.4568 234.567x_w

17、idth=0 x_fill=x_precision=4_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ * x_width=10, x_fill=&, x_precision=4 *&123 123.4568123& 123.4568x_width=0 x_fill=&x_precision=4程序的运行结果为:程序的运行结果为:25分析以上程序和运行结果,可以看出:分析以上程序和运行结果,可以看出:(1 1)在缺省情况下,)在缺省情况下,x_widthx_width取值为取值为0 0,这个,这个0 0意味着一个特意味着一个特殊的意

18、义殊的意义无域宽无域宽,即数据按自身的宽度打印,即数据按自身的宽度打印;x_fil;x_fil取值为取值为空格空格; ;x_precisionx_precision取值为取值为0 0,数据按实际的小数位,数据按实际的小数位数打印,例如数打印,例如 123.45678 123.45678,其小数的位数就按其实际的,其小数的位数就按其实际的5 5位打印。位打印。(2 2)当用)当用width( )width( )函数设置了域宽后,只对紧跟着它的第一函数设置了域宽后,只对紧跟着它的第一个输出有影响,当第一个输出完成后,个输出有影响,当第一个输出完成后,x_width x_width 立即自立即自动置

19、为动置为0 0。而调用。而调用precision( )precision( )函数和函数和fill( )fill( )函数,设函数,设置了置了 x_fillx_fill和和 x_precisionx_precision后,在程序中一直有效,除后,在程序中一直有效,除非它们被重新设置。非它们被重新设置。26(3 3)当设置了)当设置了x_precisionx_precision后,若实际输出数值的精度与其后,若实际输出数值的精度与其不一致时,最终的输出结果为:当实际输出的小数位数不一致时,最终的输出结果为:当实际输出的小数位数大于大于x_precisionx_precision,则以则以x_pr

20、ecisionx_precision的位数按四舍五入的位数按四舍五入输出;当实际输出的小数位数小于输出;当实际输出的小数位数小于x_precisionx_precision,则按则按实际的小数位数输出。实际的小数位数输出。 例如本例中当例如本例中当x_precisionx_precision设置为设置为4 4时,时,123.45678123.45678被四舍五入为被四舍五入为123.4568123.4568输出,而输出,而234.567234.567仍按原值输出。仍按原值输出。(4 4)当显示数据所需的宽度比使用)当显示数据所需的宽度比使用ios:width( )ios:width( )设置的

21、宽设置的宽度小时,空余的位置用填充字符来填充,缺省情况下的度小时,空余的位置用填充字符来填充,缺省情况下的填充字符是填充字符是空格空格。填充字符的填充位置由。填充字符的填充位置由ios:leftios:left和和ios:rightios:right规定,若设置规定,若设置ios:leftios:left,则字符填充在数则字符填充在数据右边(输出数据左对齐);若设置据右边(输出数据左对齐);若设置ios:rightios:right(缺省缺省设置),则字符填充在数据左边(输出数据右对齐)。设置),则字符填充在数据左边(输出数据右对齐)。272.使用预定义的操作符进行使用预定义的操作符进行I/O

22、格式控制格式控制 v使用使用iosios类中的成员函数进行类中的成员函数进行I/OI/O格式控制时,格式控制时,每个函数的调用需要写一条语句,而且不能将每个函数的调用需要写一条语句,而且不能将他们直接嵌入到他们直接嵌入到I/OI/O语句中去,显然使用起来不语句中去,显然使用起来不太方便。太方便。vC+C+提供了另一种进行提供了另一种进行I/OI/O格式控制的方法,这格式控制的方法,这一方法使用了一种称为一方法使用了一种称为操作符操作符的特殊函数。的特殊函数。v在很多情况下,使用操作符(操作符函数)进在很多情况下,使用操作符(操作符函数)进行格式化控制比用行格式化控制比用iosios类中的成员函

23、数要方便。类中的成员函数要方便。28v所有不带形参的操作符都定义在头文件所有不带形参的操作符都定义在头文件iostream.hiostream.h中中v而带形参的操作符则定义在头文件而带形参的操作符则定义在头文件iomanip.hiomanip.h中,中,因而使用相应的操作符就必须包含相应的头文因而使用相应的操作符就必须包含相应的头文件。件。 29C+C+提供的预定操作符如下:提供的预定操作符如下: decdec:以十进制形式输入或输出整型数,可用于输入或输以十进制形式输入或输出整型数,可用于输入或输出。出。 hexhex:以十六进制形式输入或输出整型数,可用于输入或以十六进制形式输入或输出整

24、型数,可用于输入或输出。输出。 octoct:以八进制形式输入或输出整型数,可用于输入或输以八进制形式输入或输出整型数,可用于输入或输出。出。 wsws:用于在输入时跳过前导的空白符,可用于输入用于在输入时跳过前导的空白符,可用于输入 endlendl:插入一个换行符并刷新输出流,仅用于输出。插入一个换行符并刷新输出流,仅用于输出。 endsends:插入一个空字符插入一个空字符00,通常用来结束一个字符,通常用来结束一个字符串,仅用于输出。串,仅用于输出。 flushflush:刷新一个输出流,仅用于输出。刷新一个输出流,仅用于输出。30 setbase(int n)setbase(int

25、n):设置数制转换基为设置数制转换基为 n n(n n的取值为的取值为0 0、8 8、1010或或1616),),n n的缺省值为的缺省值为0 0,即表示采用十进制,仅用于,即表示采用十进制,仅用于输出。输出。 resetiosflags(long f)resetiosflags(long f):关闭由参数关闭由参数f f指定的格式标志,指定的格式标志,可用于输入或输出。可用于输入或输出。 setiosflags(long f)setiosflags(long f):设置由参数设置由参数f f指定的格式标志,指定的格式标志,可用于输入或输出。可用于输入或输出。 setfill(int ch)s

26、etfill(int ch):设置设置chch为填充字符,缺省时为空格,为填充字符,缺省时为空格,可用于输入或输出。可用于输入或输出。 setprecision(int n)setprecision(int n):设置小数部分的位数,可用于输设置小数部分的位数,可用于输入或输出。入或输出。 setw(int n)setw(int n):设置域宽为设置域宽为n n,可用于输入或输出。可用于输入或输出。31操作符操作符setiosflags()setiosflags()和和resetiosflagsresetiosflags中所有的格式标志如表中所有的格式标志如表10.310.3所示。所示。 操作

27、符操作符setiosflagssetiosflags中所用的格式标志中所用的格式标志格式标志名格式标志名含义含义ios:left输出数据按域宽左对齐输出输出数据按域宽左对齐输出ios:right输出数据按域宽右对齐输出输出数据按域宽右对齐输出ios:scientific使用科学计数法表示浮点数使用科学计数法表示浮点数ios:fixed使用定点形式表示浮点数使用定点形式表示浮点数ios:dec转换基数为十进制形式转换基数为十进制形式ios:hex转换基数为十六进制形式转换基数为十六进制形式ios:oct转换基数为八进制形式转换基数为八进制形式ios:uppercase十六进制形式和科学计数法输出

28、时,表示数值的字符一律为大写十六进制形式和科学计数法输出时,表示数值的字符一律为大写ios:showbase输出带有一个表示制式的字符(如输出带有一个表示制式的字符(如“X”表示十六进制,表示十六进制,“O”表示八进表示八进制)制)ios:showpos在正数前添加一个在正数前添加一个“+”号号ios:showpoint浮点输出时必须带有一个小数点浮点输出时必须带有一个小数点32【例【例10.3】 操作符的使用。操作符的使用。 /* 10_03.cpp */#include#includeint main() coutsetw(10)123567endl; / cout123setiosfla

29、gs(ios:scientific)setw(20) / 123.456789endl; cout123setw(10)hex123endl; / cout123setw(10)oct123endl; / cout123setw(10)dec123endl; / coutresetiosflags(ios:scientific)setprecision(4) / 123.456789endl; coutsetiosflags(ios:left)setfill(#)setw(8) / 123endl; coutresetiosflags(ios:left)setfill($)setw(8) /

30、456”和和“”“”和输出流运算符和输出流运算符“”“”的内容,在的内容,在第章的第章的7.47.4节中已经详细讲解,在此再通过一节中已经详细讲解,在此再通过一个示例加以巩固。个示例加以巩固。Continue3510.4 文件的输入输出文件的输入输出 v文件是指存储在外部介质上的具有相同名字的一组相关文件是指存储在外部介质上的具有相同名字的一组相关数据的集合。它可以是具有一定功能的程序模块或一组数据的集合。它可以是具有一定功能的程序模块或一组数据。数据。vC+C+把数据文件看作字符(字节)序列,即由一个一个把数据文件看作字符(字节)序列,即由一个一个字符(字节)的数据顺序组成的。字符(字节)的

31、数据顺序组成的。v根据文件中数据的存放形式,文件分为根据文件中数据的存放形式,文件分为: : ASCIIASCII文件文件 二进制文件二进制文件36vASCIIASCII文件又称文件又称文本文件文本文件,它的每一个字节存放一个,它的每一个字节存放一个ASCIIASCII代码,代表一个字符。代码,代表一个字符。v其优点是可直接按字符形式输出文件的内容,也可用一其优点是可直接按字符形式输出文件的内容,也可用一般的字处理软件直接打开并查看文件的内容般的字处理软件直接打开并查看文件的内容. .v缺点是占存储空间较多。缺点是占存储空间较多。v二进制文件,将数据用二进制形式存放在文件中,并保二进制文件,将

32、数据用二进制形式存放在文件中,并保持了数据在内存中存放的原有格式;持了数据在内存中存放的原有格式;v其优点是存储效率高,无须进行存储形式的转换其优点是存储效率高,无须进行存储形式的转换. .v但不能直接按字符形式输出。但不能直接按字符形式输出。37C+C+语言中进行文件操作的一般步骤如下语言中进行文件操作的一般步骤如下: :()为要进行操作的文件定义一个流对象。()为要进行操作的文件定义一个流对象。()建立(或打开)文件。如果文件不存在,则建立该文()建立(或打开)文件。如果文件不存在,则建立该文件;如果磁盘上已存在该文件,则打开它。件;如果磁盘上已存在该文件,则打开它。()进行读()进行读/

33、 /写操作。在建立(或打开)的文件上执行所写操作。在建立(或打开)的文件上执行所要求的输入要求的输入/ /输出操作。一般来说,在主存与外设的数输出操作。一般来说,在主存与外设的数据传输中,由主存到外设叫做输出或写,而由外设到主据传输中,由主存到外设叫做输出或写,而由外设到主存叫做输入或读。存叫做输入或读。()关闭文件。当不需要进行其他输入输出操作时,应把()关闭文件。当不需要进行其他输入输出操作时,应把已打开的文件关闭。已打开的文件关闭。38对文件的读写操作有两种方式:对文件的读写操作有两种方式:()顺序文件操作()顺序文件操作: :v从文件的第一个字符(字节)开始顺序地处理到文件的从文件的第

34、一个字符(字节)开始顺序地处理到文件的最后一个字符(字节)。最后一个字符(字节)。v只能只能从文件的开始处依次顺序读写文件内容,而不能任从文件的开始处依次顺序读写文件内容,而不能任意读写文件内容意读写文件内容。()随机文件操作()随机文件操作: :v在文件中通过在文件中通过C+C+相关的函数移动文件指针,并指向所相关的函数移动文件指针,并指向所要处理的字符(字节)。要处理的字符(字节)。v可以在文件中来回移动文件指针和非顺序地读写文件内可以在文件中来回移动文件指针和非顺序地读写文件内容容。能快速地检索、修改和删除文件中的信息。能快速地检索、修改和删除文件中的信息。 3910.4.1 通过通过F

35、ILE结构进行文件操作结构进行文件操作 vC+C+保留了保留了ANSI CANSI C对文件的处理方式,程序对每个文件对文件的处理方式,程序对每个文件都使用一个单独的都使用一个单独的FILEFILE结构结构来处理。来处理。v每个被使用的文件都在内存中开辟一个区,用来存放文每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态、文件当前位件的有关信息(如文件的名字、文件状态、文件当前位置等)。这些信息保存在一个类型为置等)。这些信息保存在一个类型为FILEFILE的结构体变量的结构体变量中。中。40v该结构体类型该结构体类型FILEFILE是由系统定义的。是由系统定

36、义的。在在stdio.hstdio.h文件中对文件中对FILEFILE结构体类型是这样定义的:结构体类型是这样定义的:typedef structtypedef struct int _fd; int _fd; /文件号文件号int _cleft; int _cleft; /缓冲区中剩余的字符缓冲区中剩余的字符int _mode; int _mode; /文件操作模式文件操作模式char char * *_nextc; _nextc; / /下一个字符位置下一个字符位置char char * *_buff; _buff; /文件缓冲区位置文件缓冲区位置 FILE;FILE;v用结构体类型用结构

37、体类型FILEFILE可以定义文件型指针变量,例如:可以定义文件型指针变量,例如:FILE FILE * *fp;fp;41打开文件打开文件v用用stdio.hstdio.h文件中定义的文件中定义的fopen()fopen()函数可以实现文件的建函数可以实现文件的建立和打开操作。立和打开操作。C+C+中中stdio.hstdio.h改为改为cstdio.hcstdio.h。vfopenfopen函数的调用方式通常为函数的调用方式通常为: : FILE FILE * *fp;fp; fp=fopen( fp=fopen(文件名,文件的使用方式文件名,文件的使用方式););例如:例如:FILE F

38、ILE * *fp;fp;fp=fopen(abc.txt,r);fp=fopen(abc.txt,r);42v在打开一个文件时,通知给编译系统以下在打开一个文件时,通知给编译系统以下3 3个信息:个信息:(1 1)需要打开的文件名,也就是准备访问的文件的名字。)需要打开的文件名,也就是准备访问的文件的名字。(2 2)让哪一个指针变量指向被打开的文件。)让哪一个指针变量指向被打开的文件。(3 3)使用文件的方式()使用文件的方式(“读读”还是还是“写写”等)。文件的使等)。文件的使 用方式如表用方式如表10.410.4所示。所示。43表表10.4 文件的使用方式文件的使用方式442 关闭文件关

39、闭文件 v在使用完一个文件后应该关闭它,以防止文件再被误用。在使用完一个文件后应该关闭它,以防止文件再被误用。“关闭关闭”就是使文件指针变量不指向该文件,此后不能就是使文件指针变量不指向该文件,此后不能再通过该指针对原来与其相联系的文件进行读写操作。再通过该指针对原来与其相联系的文件进行读写操作。除非再次打开,使该指针变量重新指向该文件。除非再次打开,使该指针变量重新指向该文件。v用用fclosefclose函数函数可以实现文件的关闭操作。可以实现文件的关闭操作。fclosefclose函数调函数调用的一般形式为用的一般形式为: :fclosefclose(文件指针);文件指针);vfclos

40、efclose函数也带回一个值,当顺利执行了关闭操作,则函数也带回一个值,当顺利执行了关闭操作,则返回值为返回值为0 0;否则返回;否则返回EOFEOF(即即-1-1)。)。45文件的读写文件的读写 ()顺序文件操作()顺序文件操作 fgetcfgetc和和fputcfputc函数函数vfgetcfgetc函数的功能是函数的功能是从指定的文件读入一个字符从指定的文件读入一个字符,该文,该文件必须是以读或读写方式打开的。件必须是以读或读写方式打开的。例如,例如,ch=fgetc(fp);ch=fgetc(fp);v其中,其中,fpfp为文件型指针变量,为文件型指针变量,chch为字符变量。为字符

41、变量。fgetcfgetc函函数带回一个字符赋给数带回一个字符赋给chch。v如果在执行如果在执行fgetcfgetc函数读字符时遇到文件结束符,函数函数读字符时遇到文件结束符,函数返回一个文件结束标志返回一个文件结束标志EOFEOF(即即-1-1)。)。EOFEOF是在是在cstdio.hcstdio.h文件中定义的符号常量,值为文件中定义的符号常量,值为-1-1。46v如果想从一个磁盘顺序文件读入字符并在屏幕上显示出如果想从一个磁盘顺序文件读入字符并在屏幕上显示出来,可以用以下程序段来实现来,可以用以下程序段来实现: :ch=fgetc(fp);ch=fgetc(fp);while(ch!

42、=EOF)while(ch!=EOF) putchar(ch);putchar(ch);ch=fgetc(fp);ch=fgetc(fp); 47fgetsfgets和和fputsfputs函数函数vfgetsfgets函数的功能是从指定文件读入一个函数的功能是从指定文件读入一个字符串字符串如:如:fgets(str,n,fp);fgets(str,n,fp);n n为要求得到的字符,放到字符数组为要求得到的字符,放到字符数组strstr中,如果在读入中,如果在读入过程中遇到换行符或过程中遇到换行符或EOFEOF,读入结束。读入结束。fgetsfgets函数的返回值为函数的返回值为strstr

43、的首地址的首地址。vfputsfputs函数的功能是向指定的文件输出一个字符串如语函数的功能是向指定的文件输出一个字符串如语句:句:fputs(Olympic,fp);fputs(Olympic,fp);把字符串把字符串“Olympic”Olympic”输出到输出到fpfp指向的文件。指向的文件。fgetsfgets和和fputsfputs函数以指定的文件为读写对象。函数以指定的文件为读写对象。48fscanffscanf和和fprintffprintf函数函数vfscanffscanf、fprintffprintf函数与函数与scanfscanf、printfprintf函数的作用相仿,函数

44、的作用相仿,但但scanfscanf和和printfprintf函数的函数的读写对象是终端读写对象是终端(屏幕),而(屏幕),而fscanffscanf和和fprintffprintf函数的函数的读写是磁盘文件读写是磁盘文件。它们的一般。它们的一般调用形式为调用形式为: :fprintf(fprintf(文件指针文件指针, ,格式字符串格式字符串, ,输出表列输出表列););fscanf(fscanf(文件指针文件指针, ,格式字符串格式字符串, ,输入表列输入表列););例如:例如:fprintf(fp, %d,% f,i,t);fprintf(fp, %d,% f,i,t);v该语句的作用

45、是将整型变量该语句的作用是将整型变量i i和实型变量和实型变量t t的值按的值按% %d d和和% %f f的格式输出到的格式输出到fpfp指向的文件中。指向的文件中。49()随机文件操作()随机文件操作freadfread和和fwritefwrite函数函数v它们的功能是用来它们的功能是用来读写一个数据块读写一个数据块。一般调用形式为。一般调用形式为: :fread(buffer,size,count,fp);fread(buffer,size,count,fp);fwrite(buffer,size,count,fp);fwrite(buffer,size,count,fp);其中,其中,

46、bufferbuffer是一个指针,是读入或输出数据的地址。是一个指针,是读入或输出数据的地址。sizesize是要读写的字节数。是要读写的字节数。countcount是要进行读写多少个是要进行读写多少个sizesize字节的数据项。字节的数据项。fpfp为文件型指针。为文件型指针。例如:例如: fread(f,4,2,fp); fread(f,4,2,fp); 从从fpfp所指向的文件读入两次(每次所指向的文件读入两次(每次4 4个字节)数据,存储个字节)数据,存储 到数组中到数组中f f中。中。 50文件定位函数文件定位函数v文件的随机读写就是可以将文件指针直接定位在所要求文件的随机读写就

47、是可以将文件指针直接定位在所要求读写的位置上,而不必从文件头开始直到要求的位置再读写的位置上,而不必从文件头开始直到要求的位置再进行读写。进行读写。v为此为此C+C+提供了文件定位函数提供了文件定位函数rewindrewind函数、函数、fseekfseek函数和函数和ftellftell函数。函数。vrewindrewind函数函数的功能是使位置指针重新返回到文件的开头。的功能是使位置指针重新返回到文件的开头。该函数没有返回值。其调用形式为该函数没有返回值。其调用形式为rewind(rewind(文件指针文件指针););51vfseekfseek函数函数的功能是将文件指针移动到指定的位置上。

48、的功能是将文件指针移动到指定的位置上。其调用形式为其调用形式为: :fseek(fseek(文件指针文件指针, ,偏移量偏移量, ,起始点起始点) )v“偏移量偏移量”指以指以“起始点起始点”为基点,向前移动的字节数。为基点,向前移动的字节数。v“起始点起始点”可以是文件开始、文件当前位置和文件末尾可以是文件开始、文件当前位置和文件末尾3 3种,如表种,如表10.510.5所示。所示。表表10.510.5“起始点起始点”的符号常量和数字表示的符号常量和数字表示 52例如:例如:fseek(fp,100,0);fseek(fp,100,0);/将位置指针移到离文件头将位置指针移到离文件头1001

49、00个字节处个字节处fseek(fp,50,1); fseek(fp,50,1); /将位置指针移到离当前位置将位置指针移到离当前位置5050个字节处个字节处fseek(fp,-10,2); fseek(fp,-10,2); /将位置指针从文件末尾处后退将位置指针从文件末尾处后退1010个字节个字节 ftellftell函数函数vftellftell函数的功能是函数的功能是返回文件指针的当前读写位置返回文件指针的当前读写位置。这。这个位置是用相对于文件起始位置的字节偏移量来表示的。个位置是用相对于文件起始位置的字节偏移量来表示的。其调用形式为其调用形式为: :ftell(ftell(文件指针文

50、件指针););v当函数成功调用后则返回文件的当前读写位置,否则返当函数成功调用后则返回文件的当前读写位置,否则返回回-1-1。 5310.4.2 通过文件流进行文件操作通过文件流进行文件操作 1. 1. 文件的打开文件的打开 v在在C+C+中,打开一个文件,就是将这个文件与一个中,打开一个文件,就是将这个文件与一个流流建建立立关联关联;关闭一个文件,就是取消这种关联。;关闭一个文件,就是取消这种关联。vC+C+有有3 3种类型的文件流:种类型的文件流:输入文件流输入文件流ifstreamifstream输出文件流输出文件流ofstreamofstream输入输出文件流输入输出文件流fstrea

51、mfstreamv这些文件流都定义在这些文件流都定义在fstream.hfstream.h文件中或名字空间文件中或名字空间stdstd的的文件文件fstreamfstream中。中。54要执行文件的输入输出,需做以下几件事:要执行文件的输入输出,需做以下几件事:()在程序中包含头文件()在程序中包含头文件fstream.hfstream.h或名字空间或名字空间stdstd的文件的文件fsteamfsteam。()()建立流。建立流的过程就是定义流类的对象,建立流。建立流的过程就是定义流类的对象, 例如:例如:ifstream in;ifstream in;ofstream out;ofstre

52、am out;fstream both;fstream both; 分别定义了输入流对象分别定义了输入流对象inin;输出流对象输出流对象outout,输入输出输入输出流对象流对象bothboth。55()使用()使用open( )open( )函数打开文件,也就是使某一文件与上函数打开文件,也就是使某一文件与上面的某一流相联系。面的某一流相联系。open( )open( )函数是上述函数是上述3 3个流类的成员函数个流类的成员函数,其原型是在,其原型是在fstream.hfstream.h中定义的,原型为:中定义的,原型为:void open(const unsigned charvoid

53、open(const unsigned char* *,int mode, int ,int mode, int access=filebuf:openprot); access=filebuf:openprot);56void open(const unsigned charvoid open(const unsigned char* *,int mode, int ,int mode, int access=filebuf:openprot); access=filebuf:openprot);v其中第一个参数是用来传递文件名的;其中第一个参数是用来传递文件名的;v第二个参数第二个参数mo

54、demode的值决定文件将如何被打开,它必须取的值决定文件将如何被打开,它必须取下面的值中的一个:下面的值中的一个:ios:app /ios:app /使输出追加到文件尾部使输出追加到文件尾部ios:ate /ios:ate /打开文件时文件指针定位到文件尾部打开文件时文件指针定位到文件尾部ios:in /ios:in /打开一个文件进行读操作打开一个文件进行读操作ios:out /ios:out /打开一个文件进行写操作打开一个文件进行写操作ios:nocreate /ios:nocreate /文件不存在时,导致打开失败文件不存在时,导致打开失败ios:noreplace /ios:nor

55、eplace /若文件存在,导致打开失败若文件存在,导致打开失败ios:trunk /ios:trunk /若文件存在,则清空原文件若文件存在,则清空原文件ios:binary /ios:binary /文件以二进制方式打开,缺省时为文本文件文件以二进制方式打开,缺省时为文本文件57下面对这些值作进一步的说明:下面对这些值作进一步的说明: 如果希望向文件尾部添加数据,则应当用如果希望向文件尾部添加数据,则应当用“ios:app”ios:app” 方式打开文件,但此时方式打开文件,但此时文件必须存在文件必须存在。打开时,文。打开时,文件位件位 置指针移到文件尾部置指针移到文件尾部。用这种方式打开

56、的文件。用这种方式打开的文件只能用于只能用于 输出输出。 用用“ios:ate”ios:ate”方式打开一个已存在的文件时,文件位方式打开一个已存在的文件时,文件位 置指针自动移到文件的尾部。置指针自动移到文件的尾部。 用用“ios:in”ios:in”方式打开的文件方式打开的文件只能用于输入数据,而且只能用于输入数据,而且 该文件必须已经存在该文件必须已经存在。v如果用类如果用类ifstreamifstream来产生一个流,则隐含为输入流,不来产生一个流,则隐含为输入流,不必再说明使用方式。必再说明使用方式。v用用“ios:out”ios:out”方式打开文件,表示可以向该文件输出方式打开文

57、件,表示可以向该文件输出数据。数据。v如果用类如果用类ofstreamofstream来产生一个流,则隐含为输出流,不来产生一个流,则隐含为输出流,不必再说明使用方式。必再说明使用方式。58 通常,当用通常,当用open()open()函数打开文件时,如果文件存在,则函数打开文件时,如果文件存在,则打开该文件,否则建立该文件。打开该文件,否则建立该文件。v但当用但当用“ios:nocreate”ios:nocreate”方式打开文件时,表示不方式打开文件时,表示不建建立新文件立新文件,在这种情况下,如果要打开的文件不存在,在这种情况下,如果要打开的文件不存在,则函数则函数open()open(

58、)调用失败。调用失败。v相反,如果使用相反,如果使用“ios:noreplace”ios:noreplace”方式打开文件,则方式打开文件,则表示不修改原来文件,而是要表示不修改原来文件,而是要建立新文件建立新文件。因此,如果。因此,如果文件已经存在,则文件已经存在,则open()open()函数调用失败。函数调用失败。59 当使用当使用“ios:trunc”ios:trunc”方式打开文件时,如果文件已存方式打开文件时,如果文件已存在,则清除该文件的内容,文件长度被压缩为在,则清除该文件的内容,文件长度被压缩为0 0。v实际上,如果指定实际上,如果指定“ios:out”ios:out”方式,

59、且未指定方式,且未指定“ios:ate”ios:ate”方式或方式或“iosios:app”app”方式,则隐含为方式,则隐含为“iosios:trunc”trunc”方式。方式。如果使用如果使用“ios:binary”ios:binary”方式,则以二进制方式打开文方式,则以二进制方式打开文件,缺省时,所有的文件以文本方式打开。件,缺省时,所有的文件以文本方式打开。v在用文本文件向计算机输入时,把回车和换行两个字符在用文本文件向计算机输入时,把回车和换行两个字符转换为一个换行符,而在输出时把换行符转换为回车和转换为一个换行符,而在输出时把换行符转换为回车和换行两个字符。换行两个字符。v对于二

60、进制文件则不进行这种转换,在内存中的数据形对于二进制文件则不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。式与输出到外部文件中的数据形式完全一致,一一对应。60vaccessaccess的值决定文件的访问方式。文件的访问方式指的的值决定文件的访问方式。文件的访问方式指的是文件类别(文件属性)。它们是:是文件类别(文件属性)。它们是:普通文件普通文件-0-0只读文件只读文件-1-1隐含文件隐含文件-2-2系统文件系统文件-4-4备份文件备份文件-8-8vaccessaccess的缺省值是的缺省值是filebuf:openprotfilebuf:openprot(其中其中filebuffilebuf是是流类

温馨提示

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

评论

0/150

提交评论