C++语言程序设计教程Ch9-文件地简单操作_第1页
C++语言程序设计教程Ch9-文件地简单操作_第2页
C++语言程序设计教程Ch9-文件地简单操作_第3页
C++语言程序设计教程Ch9-文件地简单操作_第4页
C++语言程序设计教程Ch9-文件地简单操作_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

内容提要文件的概念顺序文件操作随机文件操作

第8章

文件的简单操作1文件的概念

文件是指存储在存储介质上的数据的集合。C++将文件看作是由一个一个字符(字节)的数据顺序组成的。它的组成形式可以分为:ASCII文件和二进制文件。

ASCII文件又称文本文件,它的每一个字节存放一个ASCII代码,代表一个字符;

二进制文件是将数据用二进制形式存放在文件中,它保持了数据在内存中存放的原有格式。

第8章

文件的简单操作2无论是文本文件还是二进制文件,都需要用“文件指针”来操纵。

一个文件指针总是和一个文件相关联,当文件每一次打开时,文件指针指向文件的开始,随着对文件的操作,文件指针不断地在文件中移动,并一直指向最后处理的字符(字节)位置。

对文件的操作有两种方式:顺序文件操作和随机文件操作。

第8章

文件的简单操作3内容提要文件的概念顺序文件操作随机文件操作

第8章

文件的简单操作4顺序文件操作顺序文件操作,即从文件的第一个字符(字节)开始,顺序地处理到文件的最后一个字符(字节),文件指针相应地从文件的开始位置到文件的结尾。顺序文件操作包括打开文件、读写文件和关闭文件三个步骤。

第8章

文件的简单操作5顺序文件操作文件的打开和关闭是通过使用fstream类的成员函数open和close来实现的。fstream类是用来对文件流进行操作,它和前面的标准输出输入流(cout/cin)一起,是C++实现流操作的最基本的类,而且它们有一个共同的基类ios。为了能使用这些类的相关函数,还必须在程序中添上相关的包含文件,例如:cout和cin的头文件是iostream.h,而fstream类的头文件是fstream.h。

ifstreamin;//objectofinputstream

ofstreamin;//objectofoutputstream

fstreamin;//objectofinputandoutputstream

第8章

文件的简单操作61.打开文件打开文件应使用成员函数open(),该成员函数的函数原型为:voidopen(constunsignedchar*filename,

int

nMode,

int

nPort=filebuf::openprot);

其中:filename是一个字符型指针,指定要打开的文件名,文件名中可以包含驱动器号及多层子目录的完全路径名,在路径名中要用双反斜杠(\\)将目录隔开,通常可以用一对双引号包括的字符串常量作为实参,也可以用主函数main()的参数argv[]传递命令行。如:

第8章

文件的简单操作7

ifstreamf1;f1.open(“e:\\user\\filename.cpp”);//缺省时把nMode设置为ios::in//输入文件流f1与文件filename.cpp相关

//联,即打开一个文本文件进行读操作

第8章

文件的简单操作8

在使用f1之前,必须先建立一个文件缓冲器,并将这个流对象和文件缓冲器以及一个真实的物理文件连接起来。这两项任务由ifstream中的成员函数open()完成。如果打开一个文件,一切正常,则为该磁盘文件建立了一个输入缓冲器,且get指针指向缓冲器的起始位置。

第8章

文件的简单操作9

mode指定文件的打开方式,其值如下表所示;

在ios类中定义的文件打开方式

第8章

文件的简单操作文件打开方式含义ios::in以输入(读)方式打开文件ios::out以输出(写)方式打开文件ios::app打开一个文件使新的内容始终添加在文件的末尾ios::ate文件打开时,文件指针位于文件尾ios::trunc若文件存在,则清除文件所有内容;否则,创建新文件ios::binary以二进制方式打开文件,缺省时以文本方式打开文件ios::nocreat打开一个已有文件,若该文件不存在,则打开失败ios::noreplace若打开的文件已经存在,则打开失败ios::in|ios::out以读/写方式打开文件ios::in|ios::binary以二进制读方式打开文件ios::out|ios::binary以二进制写方式打开文件10

nPort表示文件保护方式,与操作系统有关,用户一般只使用缺省值,即不写该参数。(指定了文件的系统属性,其取值为:

0

一般文件

1

只读文件

2隐藏文件3系统文件

第8章

文件的简单操作11例:以提取文本数据的方式打开一个文件,其方法如下:

ifstreaminfile1(“file1.txt”,ios::in);//ios::in可缺省

ofstreamf2;f2.open(“file2.cpp”,ios::out);//ios::out可缺省

fstreamf;

f.open(“file.cpp”,ios::in|ios::out);//缺省打开方式时以文本方式打开。在这种情况下,输入时回车/换行符要转换为字符‘\n’,在输出时,字符‘\n’转换为回车/换行符,这些转换在二进制方式下是没有的。这是文本方式与二进制方式的主要区别。

第8章

文件的简单操作12此句与下面两句等价:

ifstreaminfile1;//创建infile1输入流

infile1.open(“file1.txt”,ios::in);//将输入流与文件“file1.txt”关联,即打开文件以提取二进制数据的方式打开一个文件的方法如下:ifstreaminfile2(“file2.txt”,ios::in|ios::binary);或写成:

ifstreaminfile2;infile2.open(“file2.txt”,ios::in|ios::binary);

第8章

文件的简单操作13流操作过程可能会出错,例如打开一个不存在的文件进行操作,或读一个不允许读(或写)的文件,或用不正确格式写入数据等都将产生错误,必须进行检测并加以处理,检测流错误的办法很多,通常采用:

if(!f1){<异常处理路径>}if(f1){<正常处理路径>}

第8章

文件的简单操作142.关闭文件

在文件操作结束时,应及时调用成员函数close()来关闭文件。如要关闭的文件(指针)为myfile,则可使用如下语句关闭文件:

myfile.close();

第8章

文件的简单操作153.文件的读写在打开文件后,就可以对文件进行读写操作了。

文本文件的读写可以直接使用插入符“<<”和提取符“>>”,也可以使用get()/put()函数或read()/write()函数;二进制文件的读写则只能使用get()/put()函数或read()/write()函数。

第8章

文件的简单操作16二进制文件的处理过程与文本文件的处理过程基本相同,但在判断文件是否结束时有所区别。在文本文件中,遇到文件结束符时,get()函数返回一个文件结束标志EOF,该标志的值为-1。但在处理二进制文件时,读入某一个字节中的二进制的值可能是-1,与EOF的值相同。为了避免将读入的有用数据处理成“文件结束”,C++提供了一个成员函数eof()判断文件是否结束。当达到文件尾时,它返回一个非零值,否则返回零。

第8章

文件的简单操作17当文件不指明打开方式时,即缺省时,则以文本方式打开。在这种情况下,输入时回车/换行符要转换为字符“\n”,在输出时,字符“\n”转换为回车/换行符,这些转换在二进制方式下是没有的。这是文本文件和二进制文件的主要区别。

第8章

文件的简单操作18(1)文本文件的读/写文本文件的读操作通常采用istream类中的成员函数get(),写成:ifstreamf1(“file1.cpp”);…while(f1){charc;f1.get(c);

cout<<c;}由于ifstream类由istream类派生而来,它会自动地调用成员函数:istream&get(char&c);

第8章

文件的简单操作19每次读取f1中的单个字符传给c,然后传递给CRT显示器,文件在get指针的控制下按顺序读取,直到EOF,编程者可不必关心具体实现细节。如果不是写到标准流对象cout,而是写到另一个文件中,则在进行写操作前,必须打开另一个文件,写成:ofstreamf2(“file2.cpp”);if(!f2){

cerr<<“\aCan’topenfile2.cpp.\n”;exit(1);}charc;while(f2&&f1.get(c))f2.put(c);

第8章

文件的简单操作20在while循环语句中,程序每次从f1中读取一个字符,然后由put()写到f2中,实际上是从与f1相关联的输入缓冲器中读取一个字符,写到与f2相关联的输出缓冲器中,由于get指针和put指针能自动增1,故确保了字符的读写顺序。当get指针指到输入缓冲器的终止位置时,说明整个文件已读完,此时输出缓冲器已复制了整个文件的内容,f1.get(c)读到文件尾则测试得该表达式为假(false),则程序跳出循环,执行后续语句。顺便指出,与文本文件相关联的缓冲器以NULL结尾。如前所述,对于文本文件经常采用读取一行字符串的重要函数getline(),写成:ifstreamf1(“file1.cpp”);if(!f1){cerr<<“\aCan’topenfile2.cpp.\n”;exit(1);}while(f1){charbuf[100];f1.getline(buf,sizeof(buf));cout<<buf;}

第8章

文件的简单操作21(2)二进制文件的读写

二进制文件不含空白符,数据没有通过换行符组织成一行行的形式,任何8位(bit)值都可能出现。因此,将二进制文件调到屏幕上显示出的信息很难看懂。通常是利用ostream类的成员函数write()将数据写到二进制文件。

写二进制数据有两种方法:一是一次写入一个字符,使用成员函数put(charc);二是一次写一组字符(但不是以终止符结束),则使用

ostream&write(constchar*pch,int

nCount);

第8章

文件的简单操作22(2)二进制文件的读写

为了便于调试,一般采用按字符形式格式化的方法,通过强制类型转换,将程序中要写入文件的对象或对象数组转换成字符串形式,写入二进制文件,其调用语句的一般格式为:输出文件流对象名.write((char*)&对象名或&对象数组名[下标],sizeof(<对象所属类名>));

同样读二进制文件的方法通常是将文件按字符形式格式化的方法读入到一个与写入时同类的对象或对象数组中,其调用语句的一般格式为:

输入文件流对象名.read((char*)&对象名或&对象数组名[下标],sizeof(<对象所属类名>));

第8章

文件的简单操作23这样一来,可对二进制文件读写任何类型的数据。//Demo:

二进制文件的读写.cpp如前所述,read()与write()的原型为:istream&read(char*pch,int

nCount);ostream&write(constchar*pch,int

nCount);例中是读写结构体Person的结构数组people[]。read()成员函数从输入流中读取nCount个字节,并把它们存放在pch所指的缓冲器中。write()成员函数是将nCount个字节从pch所指的缓冲器取出,写到输出流。本程序中write()是对结构数组people2[]进行操作,由于它不是字符型数组,故必须进行强制类型转换。结构数组people1[]的数据结构如图所示,结构数组people2[]的数据结构与peopl1[]一样,因此写到d:\\test\\Personal.dat文件中共有26个字节的二进制数据。

第8章

文件的简单操作24

第8章

文件的简单操作Wang\0…1.6525Zhang\0…1.7224Zhang\0…1.7224Zhang\0…1.7224people[0]people[1]people[2]people[3]25此例中写数据是否结束由cnt变量控制,不能只靠f1表达式,它只能检测写操作是否出错而不能判终,若取消cnt<4,表达式将变成无穷循环。如前所述,以二进制方式打开的文件,其关联的缓冲器不是以NULL结尾。//Demo:带命令行参数的文件.cpp

第8章

文件的简单操作26【例】向文本文件中分别写入一个整数、一个浮点数和一个字符串。#include<iostream>usingnamespacestd;#include<fstream.h>#include<stdlib.h>voidmain(void){fstream

myfile;myfile.open("f1.txt",ios::out);//以写方式打开文件f1.txt

if(!myfile){

cout<<"Can'topenfile!!"<<endl;abort(); //退出程序,包含在stdlib.h中}

myfile<<20<<endl;myfile<<4.58<<endl;

myfile<<"HelloWorld!"<<endl;myfile.close();}

第8章

文件的简单操作27【例】从文本文件中读取数据例程#include<iostream.h>#include<fstream.h>//有关文件输入、输出的定义文件#include<stdlib.h>voidmain(void){chara[101];ifstreaminfile3;infile3.open(“filein3.txt”,ios::in);//读取infile3输入流的数据if(!infile3){cout<<“Itcannotopenthefile!”<<endl;abort();}while(!infile3.eof()){infile3.getline(a,sizeof(a));cout<<a<<endl;}infile3.close();}

第8章

文件的简单操作28【例】文本文件复制例程//file文件复制操作.cpp#include<iostream.h>#include<fstream.h>//有关文件输入、输出的定义文件#include<stdlib.h>voidmain(void){charch;fstream

inf,outf;

inf.open("d:\\filein.txt",ios::in);

if(!inf){cout<<"Itcannotopenthefile!"<<endl;abort();}

outf.open("d:\\fileout.txt",ios::out);

if(!outf){cout<<"Itcannotopenthefile!"<<endl;abort();}

while(!inf.eof()&&inf.get(ch))//按字符读取文件filein.dat的数据

outf.put(ch);//将数据按字符写入文件fileout.dat中

inf.close();outf.close();}

第8章

文件的简单操作29//Demo:文件操作例.cpp

第8章

文件的简单操作30内容提要文件的概念顺序文件操作随机文件操作

第8章

文件的简单操作31随机文件操作随机文件操作,即在文件中通过C++相关的函数移动文件指针,并指向所要处理的字符(字节)。随机文件提供在文件中来回移动文件指针和非顺序地读写文件的能力,这样在读写文件中的某一数据之前不需要再读写其前

温馨提示

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

评论

0/150

提交评论