解读C++编程的相关文件操作
C++文件的概念 文件(file)是程序设计中一个重要的概念。所谓“文件”,一般指存储在外部介质上数据的集合。一批数据是以文件的形式存放在外部介质(如磁盘、光盘和U盘)上的。操 作系统是以文件为单位对数据进行管理的,也就是说,如果想找存在外部介质上的数据, 必须先按文件名找到所指定的文件,然后再从该文件中读取数据。要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。 外存文件包括磁盘文件、光盘文件和U盘文件。目前使用最广泛的是磁盘文件,为叙述方便,教程中凡用到外存文件的地方均以磁盘文件来代表,在程序中对光盘文件和U盘文件的使用方法与磁盘文件相同。 对用户来说,常用到的文件有两大类,一类是程序文件(program file),如C++的源程序文件(.cpp)、目标文件(.obj)、可执行文件(.exe)等。一类是数据文件(data file), 在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这种磁盘文件就是数据文件。程序中的输入和输出的对象就是数据文件。 根据文件中数据的组织形式,可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件或字符文件,它的每一个字节放一个ASCII代码,代表一个字符。二进制文件又称内部格式文件或字节文件,是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。 对于字符信息,在内存中是以ASCII代码形式存放的,因此,无论用ASCII文件输出还是用二进制文件输出,其数据形式是一样的。但是对于数值数据,二者是不同的。例如有一个长整数100000,在内存中占4个字节,如果按内部格式直接输出,在磁盘文件中占 4个字节,如果将它转换为ASCII码形式输出,则要占6个字节。 用ASCII码形式输出的数据是与字符一一对应的,一个字节代表一个字符,可以直接在屏幕上显示或打印出来。这种方式使用方便,比较直观,便于阅读,便于对字符逐个进行输入输出。但一般占存储空间较多,而且要花费转换时间(二进制形式与ASCII码间的转换)。用内部格式(二进制形式)输出数值,可以节省外存空间,而且不需要转换时间,但一个字节并不对应一个字符,不能直接显示文件中的内容。如果在程序运行过程中有些中间结果数据暂时保存在磁盘文件中,以后又需要输入到内存的,这时用二进制文件保存是最合适的。如果是为了能显示和打印以供阅读,则应按ASCII码形式输出。此时得到的是ASCII文件,它的内容可以直接在显示屏上观看。 C++提供了低级的I/O功能和高级的I/O功能。高级的I/O功能是把若干个字节组合为一个有意义的单位(如整数、单精度数、双精度数、字符串或用户自定义的类型的数据),然后以ASCII字符形式输入和输出。例如将数据从内存送到显示器输出,就属于高级I/O功能,先将内存中的数据转换为ASCII字符,然后分别按整数、单精度数、双精度数等形式输出。这种面向类型的输入输出在程序中用得很普遍,用户感到方便。但在传输大容量的文件时由于数据格式转换,速度较慢,效率不高。 所谓低级的I/O功能是以字节为单位输入和输出的,在输入和输出时不进行数据格式的转换。这种输入输出是以二进制形式进行的。通常用来在内存和设备之间传输一批字节。这种输入输出速度快、效率高,一般大容量的文件传输用无格式转换的I/O。但使用时会感到不大方便。 C++文件的打开与关闭 所谓打开(open)文件是一种形象的说法,如同打开房门就可以进入房间活动一样。 打开文件是指在文件读写之前做必要的准备工作,包括: 以上工作可以通过两种不同的方法实现。 1) 调用文件流的成员函数open。如 ofstream outfile; //定义ofstream类(输出文件流类)对象outfile outfile.open("f1.dat",ios::out); //使文件流与f1.dat文件建立关联
调用成员函数open的一般形式为: 2) 在定义文件流对象时指定参数 ostream outfile("f1.dat",ios::out); 一般多用此形式,比较方便。作用与open函数相同。 输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择,见表 几点说明: 1) 新版本的I/O类库中不提供ios::nocreate和ios::noreplace。 2) 每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式指定,每次读写都从文件指针的当前位置开始。每读入一个字节,指针就后移一个字节。当文件指针移到最后,就会遇到文件结束EOF(文件结束符也占一个字节,其值为-1),此时流对象的成员函数eof的值为非0值(一般设为1),表示文件结束了。 3) 可以用“位或”运算符“|”对输入输出方式进行组合,如表13.6中最后3行所示那样。还可以举出下面一些例子: ios::in | ios:: noreplace //打开一个输入文件,若文件不存在则返回打开失败的信息 ios::app | ios::nocreate //打开一个输出文件,在文件尾接着写数据,若文件不存在,则返回打开失败的信息 ios::out l ios::noreplace //打开一个新文件作为输出文件,如果文件已存在则返回打开失败的信息 ios::in l ios::out I ios::binary //打开一个二进制文件,可读可写 但不能组合互相排斥的方式,如 ios::nocreate l ios::noreplace。 4) 如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。可以据此测试打开是否成功。如 if(outfile.open("f1.bat",ios::app) ==0) cout <<"open error"; 或 if( !outfile.open("f1.bat",ios::app) ) cout <<"open error";
在对已打开的磁盘文件的读写操作完成后,应关闭该文件。关闭文件用成员函数close。如 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |