cc课件C试卷_20200520_130735chp13_第1页
cc课件C试卷_20200520_130735chp13_第2页
cc课件C试卷_20200520_130735chp13_第3页
cc课件C试卷_20200520_130735chp13_第4页
cc课件C试卷_20200520_130735chp13_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

1、第13章 输入输出流,13.1 C+的输入和输出 13.2 标准输出流 13.3 标准输入流 13.4 对数据文件的操作与文件流,13.1 C+的输入和输出,输入和输出,要站在内存中程序的立场来看: 输入:将某设备中的数据传送给程序;设备中的数据叫输入文件。 输出:将程序中的数据传送到某设备;设备得到的数据叫输出文件。 以键盘/显示器作为标准输入/输出设备: 从键盘、鼠标等得到的数据是进入内存中程序的,该数据是输入数据(输入文件)。 将数据从内存中程序送到显示器、打印机等,该数据是输出数据(输出文件)。 以外存磁盘文件作为设备: 内存中程序的数据存储到磁盘文件中,叫输出文件;从磁盘文件中的数据

2、装载入内存中,叫输入文件。 以内存中指定的空间作为设备:字符串的输入输出。,在C+语言中,数据的输入和输出(简写为I/O)包括对标准输入设备“键盘”和标准输出设备“显示器”、对在外存磁盘上的文件和对内存中指定的字符串存储空间进行输入输出这三个方面。 对标准输入设备和标准输出设备的输入输出简称为标准I/O;对在外存磁盘上文件的输入输出简称为文件I/O;对内存中指定的字符串存储空间的输入输出简称为串I/O。,C+的输入和输出,C+中把数据的传送过程称作流。在C+中,流既可以表示数据从内存传送到某个载体或设备中,即输出流;也可以表示数据从某个载体或设备传送到内存的变量中,即输入流。 在进行I/O操作

3、时,首先进行“打开”操作,使流和文件发生联系,建立联系后的文件才允许数据流入或流出,输入或输出结束后,使用“关闭”操作使文件与流断开联系。 C+将输入输出流定义为类-流类。属于流类的对象是流对象。 如:cin-标准输入流对象。 cout标准输出流对象。,C+的输入流和输出流,各种流类,C+为实现数据的输入和输出定义了一个庞大的类库。它包括的类主要有 ios,istream,ostream,iostream,ifstream,ofstream,fstream,istrstream,ostrstream,strstream 等。,头文件中定义的类,C+系统中的I/O类库,其所有类被包含在iostr

4、eam,fstream和strstream 这三个系统头文件中,各头文件包含的类如下: iostream头文件包含有: ios, iostream, istream, ostream, iostream_withassign, istream_withassign, ostream_withassign等。 fstream包含有: fstream, ifstream, ofstream和fstreambase, 以及iostream中的所有类。 strstream包含有: strstream, istrstream, ostrstream和strstreambase, 以及iostream中的

5、所有类。,包含头文件,在一个程序中当需要进行标准I/O操作时,则必须包含头文件iostream; 当需要进行文件I/O操作时,则必须包含头文件fstream; 当需要进行串I/O操作时,则必须包含头文件strstream。 当使用格式化I/O时,则包含头文件iomanip 在一个程序中包含一个头文件的命令格式为“#include” 如:#include ,4个流对象 cin,cout,cerr, clog,C+不仅定义有现成的I/O类库供用户使用,而且还为用户进行标准I/O操作定义了四个类对象,它们分别是cin,cout,cerr和clog. cin : istream_withassign流

6、类的对象,使用标准输入设备键盘,是从键盘输入数据传送到内存的数据流,也称为cin流或标准输入流. 后三个为ostream_withassign流类的对象: cout : 使用标准输出设备显示器,是从内存数据传送到显示器的数据流,也称为cout流或标准输出流.,4个流对象 cin,cout,cerr, clog,cerr和clog含义相同,均代表将错误信息输出到显示器的流。 当进行键盘输入时使用cin流; 当进行显示器输出时使用cout流; 当进行错误信息输出时使用cerr流或clog流。,13.2 标准输出流,cout流对象-Console output缩写. 在控制台(显示器)输出. 用流插

7、入运算符“”向cout输出数据. 如: cout “a=” a endl; cout 数据1 数据2 数据3; 这里的数据都是C+的基本类型的数据. 若是自定义类型的数据(如结构体), 则必须对“”重载后才能输出.,13.2 标准输出流,cerr流对象-Console error. 在控制台(显示器)输出错误信息. 用流插入运算符“”向cerr输出数据. 如: cerr “除数为0, 出错!” b c; if (a=0) cerr “ a=0, 不是二次方程,出错!”endl; else disc=b*b-4*a*c; if (disc0) cerr“二次方程无实根。”endl; else c

8、out“x1=”(-b+sqrt(disc)/(2*a)endl; cout “x2=”(-b-sqrt(disc)/(2*a)endl; return 0; ,clog流对象-在控制台(显示器)输出错误信息. 用流插入运算符“”向clog输出数据. 如: clog “除数为0, 出错!” a; / 输入34 cout“dec:”decaendl; /显示: dec:34 cout“hex:”hexaendl; /显示: hex:22 cout“oct:”octaendl; /显示: oct:42 coutsetfill(*)setw(10)decaa; / a=34 cout“hex:”he

9、xaendl; /显示: hex:22 cout.setf(ios:hex); cout“hex:”aendl; / hex:22 cout.unsetf(ios:hex); cout.fill(*); cout.width(10); cout.setf(ios:dec); coutaab; / 从键盘输入2个整数 当输入时遇到无效的字符或遇到文件结束符ctrl+C时, cin处于出错状态,无法正常提取数据. 如:输入:123 abc a接收了123 b无法接收输入值,cin被置为出错状态,cin的值为0(假值)。 if (!cin) / cin处于出错状态,无法正常提取数据 cout=85)

10、 coutgradeGOOD!endl; if(grade60) coutgradefail!endl; coutenter grade:; coutThe end.=85) coutgradeGOOD!endl; if(grade60) coutgradefail!endl; coutenter grade:; coutThe end.endl; return 0; ,enter grade: 67 enter grade: 89 89 GOOD! enter grade: 56 56 fail! enter grade: 100 100 GOOD! enter grade: C The e

11、nd.,用于字符输入的流成员函数,不带参数的get函数 cin.get() 从输入流提取1个字符; 函数返回值就是该字符.若遇到文件结束符,则返回值为EOF,即 -1. 如: char ch; while ( (ch=cin.get()!=EOF) cout.put(ch); 键盘输入: I study C+. 显示: I study C+. 键盘输入: Ctrl+C (程序结束),用于字符输入的流成员函数,2. 带1个参数的get函数 cin.get(ch) 从输入流提取1个字符放入ch, 函数返回值是非0值.若遇到文件结束符,则返回值为0. 如: char ch; while ( cin.

12、get(ch)!=0) cout.put(ch); 键盘输入: I study C+. 显示: I study C+. 键盘输入: Ctrl+C (程序结束),用于字符输入的流成员函数,3. 带3个参数的get函数 cin.get(字符数组, 字符个数n, 终止字符) 或 cin.get(字符指针, 字符个数n, 终止字符) 从输入流提取n-1个字符放入数组, 函数返回值是非0值.若遇到文件结束符,则返回值为0. 如: char str20; cin.get(str, 10, n); coutstr; 键盘输入: I study C+. 显示: I study C,用于字符输入的流成员函数,4

13、. cin.getline函数 cin.getline(字符数组, 字符个数n, 终止字符) 或 cin.getline(字符指针, 字符个数n, 终止字符) 从输入流提取n-1个字符放入数组, 函数返回值是非0值.若遇到文件结束符,则返回值为0. 如: char str20; cin.getline(str, 10, n); coutstr; 键盘输入: I study C+. 显示: I study C,cin.get 与 cin.getline 的区别,cin.get(字符数组, 字符个数n, 终止字符) 和 cin.getline(字符指针, 字符个数n, 终止字符) 相同: 从输入流

14、提取n-1个字符放入数组, 函数返回 值是非0值.若遇到文件结束符,则返回值为0. 不同: 当读到终止字符时,cin.getline将指针移到 终止字符之后。get将指针移到终止字符处。 则下次继续读取时的位置就不同。,用于字符输入的流成员函数,5. cin.eof函数 cin.eof(): 当从输入流读取数据到达文件尾,函数值为真。 如: char c; while (!cin.eof() if (c=cin.get()!= ) cout.put(c); coutab; c=a+b; cout cin - 程序端: 程序中的变量a,b 文件端: stdout - cout - 程序端: 程序

15、中的 “c=”,c,简单的文件I/O,要让程序将数据写入文件,必须: 创建一个ofstream对象来管理输出流; 将该对象与特定的文件关联起来; 以使用cout的方式使用该对象,唯一的区别是:输出将进入文件,而不是屏幕;,#include /必须包含的头文件 using namespace std; int main() int a=12 , b=34; ofstream fout; /定义ofstream类对象fout fout.open(c:c_05temptest.dat, ios:out); /使文件流与test.dat建立关联 foutaendl; foutbxy; coutx=xe

16、ndl; couty=yai; outfileaiai;/从磁盘文件读入10个整数,顺序存放在a数组中 coutai ; /在显示器上顺序显示10个数 coutendl; max=a0;,order=0; for(i=1;imax) max=ai; /将当前最大值放在max中 order=i; /将当前最大值的元素序号放在order中 coutmax=maxendlorder=ordera 正常输入了数据 coutabn 正常输入了数据 n+ ; for (int i=0; in; i+) coutbi ; infile.close( ); return 0; ,编一程序将任意文本文件内容读入

17、内存,然后输出到显示器。可以编一个专用函数。 #include #include using namespace std; void display_file(char *filename) ifstream infile(filename, ios:in); if(!infile) cerropen filename error!endl; exit(1); char ch; while( infile.get(ch) ) / 每次从文件读入1个字符存入ch cout.put(ch); / 在显示器显示ch的字符 coutfname; / 从键盘输入文件名:f3.txt display_fi

18、le( fname ); return 0; ,例13.10 从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat中。再把它从磁盘文件读入程序,将其中的小写字母改为大写字母,再存入磁盘文件f3.dat。 #include #include using namespace std; / save_to_file函数从键盘读入一行字符,并将其中的字母存入磁盘文件 void save_to_file( ) ofstream outfile(f2.dat); /定义输出文件流对象outfile,以输出方式打开磁盘文件f2.dat if (!outfile) cerropen f2.dat

19、 error!=65 ,ofstream outfile(f3.dat); /定义输出文件流outfile,以输出方式打开磁盘文件f3.dat if(!outfile) cerr=97 /关闭磁盘文件f3.dat ,int main( ) save_to_file( ); /调用save_to_file( ),从键盘读入一行字符并将其中的字母存入磁盘文件f2.dat get_from_file( ); /调用get_from_file(),从f2.dat读入字母字符,改为大写字母,再存入f3.dat return 0; 运行情况如下: New Beijing, Great Olypic, 20

20、08, China. NewBeijingGreatOlypicChina (将字母写入磁盘文件f2.dat,同时在屏幕显示) NEWBEIJINGGREATOLYPICCHINA (改为大写字母),13.4.5 对二进制文件的操作,二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。,一个长整数100000,在内存中占4个字节,如果按内部格式直接输出,在磁盘文件中占4个字节,如果将它转换为ASCII码形式输出,则要占6个字节,对二进制文件的操

21、作也需要先打开文件,用完后要关闭文件。在打开时要用ios:binary指定为以二进制形式传送和存储。二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。这是和ASCII文件不同的地方。 输入文件: ifstream infile(stud.dat, ios:in | ios:binary); 输出文件: ofstream infile(stud.dat, ios:out | ios:binary); 输入输出文件: fstream infile(stud.dat, ios:in | ios:out | ios:binary);,1. 用成员函数read和write读写二

22、进制文件 对二进制文件的读写主要用fstream类的成员函数read和write来实现。这两个成员函数的原型为 read(char *buffer, int len); write(const char * buffer, int len); 字符指针buffer指向内存中一段存储空间。len是读写的字节数。调用的方式为 outfile. write(p1,50); infile. read(p2,30);,例13.11 将一批数据以二进制形式存放在磁盘文件中。 #include #include using namespace std; struct student char name20;

23、 int num; int age; char sex; ; int main( ) student stud3=Li , 1001, 18, f, Fun, 1002, 19, m, Wang,1004, 17, f ; ofstream outfile(stud.dat, ios:out | ios:binary); if(!outfile) cerropen error! endl; abort( ); /退出程序 ,for(int i=0; i3; i+) outfile.write(char*) ,可以一次输出整个数组到磁盘文件: outfile.write(char*) 用这种方法

24、一次可以输出一批数据,效率较高。在输出的数据之间不必加入空格,在一次输出之后也不必加回车换行符。在以后从该文件读入数据时不是靠空格作为数据的间隔,而是用字节数来控制。,例13.12 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。 #include #include using namespace std; struct student string name; / 改为 char name20; int num; int age; char sex; ; int main( ) student stud3; int i; ifstream infile(stud.dat,

25、ios:in | ios:binary); if(!infile) cerropen error! endl; abort( ); ,for(i=0;i3;i+) infile.read(char*) ,能否一次读入文件中的全部数据,如 infile.read( (char*) 可以。,运行时在显示器上显示: NO.1 name: Li num: 1001 age: 18 sex: f NO.2 name: Fun num: 1001 age: 19 sex: m NO.3 name: Wang num: 1004 age: 17 sex: f,2. 与文件指针有关的流成员函数,在磁盘文件中有

26、一个文件指针,用来指明当前应进行读写的位置。对于二进制文件(文本文件也行),允许对指针进行控制,使它按用户的意图移动到所需的位置,以便在该位置上进行读写。文件流提供一些有关文件指针的成员函数。 infile.gcount( ) 返回最新一次输入的字节数 如: infile.read( ,infile.tellg( ) 函数返回输入文件指针的当前位置 (long型整数,以字节为单位,从0算起) infile.seekg( 文件中的位置 );将输入文件的指针移到指定的 位置 infile.seekg( 位移量,参照位置 ); 将输入文件指针移到从 参照位置为基础移动若干字节位置 Outfile.t

27、ellp( ) 返回输出文件指针的当前位置 Outfile.seekp( 文件中的位置 ) Outfile.seekp( 位移量,参照位置 ),infile.seekg( 位移量,参照位置 ); 将输入文件指针移到从 参照位置为基础移动若干字节位置 Outfile.seekp( 位移量,参照位置 );将输出文件指针移到从 参照位置为基础移动若干字节位置 参照位置:ios:beg 文件开头begin(默认值) ios:cur 指针当前位置current ios:end 文件末尾(已超出文件尾) 如: infile.seekg(100); 输入文件指针移到文件第101字节 处。第1个字符的位置是0

28、 infile.seekg(-50, ios:cur );从当前位置回移50个字节,值得注意的是: 当文件对象发生操作异常(指针已在文件尾,还要读数据,则eof发生;打开文件失败;)时,其之后的相关操作都会失效。因此,要用clear( )函数将其错误状态清除,使得其后的操作有效。,fin.seekg(0 , ios:beg); cout“begin=”fin.tellg()endl; / 显示 0 fin.seekg(0,ios:end); fin.get(); / 在文件尾还要读数据,eof出现。fin状态异常 coutend=fin.tellg( )eof( )=fin.eof()endl

29、; / 显示:end= -1 eof( )=1 fin.seekg(0,ios:beg); / 由于fin状态异常,seekg不起作用 cout“begin=”fin.tellg()endl; / 显示:begin= -1,值得注意的是: 当文件对象发生操作异常(指针已在文件尾,还要读数据,则eof发生;打开文件失败;)时,其之后的相关操作都会失效。因此,要用clear( )函数将其错误状态清除,使得其后的操作有效。,fin.seekg(0,ios:beg); cout“begin=”fin.tellg()endl; / 显示 0 fin.seekg(0,ios:end); fin.get(); / 在文件尾还要读数据,eof出现。fin状态异常 coutend=fin.tellg( )eof( )=fin.eof()endl; / 显示:end= -1 eof( )=1 fin.clear( ); / 将fin的异常状态清除 fin.seekg(0,ios:beg); / seekg起作用,指针移到文件头 cout“begin=”fin.tellg( )endl; / 显示:begin= 0,3. 随机访问二进制数据文件,一般情况下读写是顺序进行的,即逐个字节进行读写。但是对于二进制数据文件来说,可以利用上面的成员函数移动指针,随机地访问文件中任一位置上的数

温馨提示

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

评论

0/150

提交评论