C/C++中的文件是非常重要的概念。所谓“文件”一般是指,存储在外部介质上数据的集合, 并且是一组相关数据的有序集合。当文件被使用时,将其调入内存中。
文件可分为两种:一种是上述所说的,就是驻留在磁盘或其他外部介质上的一个有序数据集,可以是数据文件、可执行程序等;另一种是设备文件,是指和主机相联的各种设备,像显示器、键盘、打印机等;外部设备一般可以看作一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。
在C语言中,文件的类型可以分为两种:缓冲型和非缓冲型。文件系统的读写因此也分为两种方法:缓冲文件系统-般用来处理文本文件;非缓冲文件系统可以用来处理二进制文件。C语言函数库中包含了大量的文件处理函数。当需要使用这批函数时,需要在源程序中包含头文件“stdio.h”。
同样在C++语言中,关于文件的处理功能更加高级,新封装了部分模板和部分类。常用的类包括:
- ifstream 和wifstream,用来读取文件; wifstream 是字读取操作。
- ofstream 和wofstream,用来将数据写入文件: wofstream 是字读取操作。
- fstream 和wfstream,用于读/写文件; wfstream 是字读取操作。
- filebuf 和wfilebuf,用来进行实际的字符读写: wfilebuf 是字读/写操作类。
注意:使用上述几个类时,需要包含头文件。
下面介绍在C++ STL (模板库)中如何使用文件操作。
1、文件标识
在C语言中,打开文件时一般需要使用标识符来表明文件的使用方式。同样,在C++语言中,打开文件时同样需要使用文件标识符( 文件模式常量)来说明文件的使用方式。常用的文件模式常量包括:
ios base: :in 打开文件,用于读取
ios base: :out 打开文件,用于改写或写入
ios base: :ate 打开文件,用于将文件指针移到文件末尾
ios base: :app 打开文件,写入时始终添加入尾端
ios base: : trunc 打开文件,将先前的内容移除
ios_ base: :binary 以二进制形式打开文件。
2、文件的读写
本小节主要讲述如何使用ifstream类和ofstream类。这两个类均包含了一批各自的成员函数。这些成员函数主要用于打开和关闭文件,设置文件缓冲区,读取和写入文件,文件指针定位等。下面举例说明文件的读/写操作。下例代码实现的功能是将源文件中的内容读取出来,将这些内容再写入目标文件。
#include <iostream>
#include <fstream>
using namespace std;
void main()
{
ifstream f1 ;
ofstream f2 ;
char filename1 [256] ;
char filename2[256] ;
char content[256] ;
cout<<"请输入文件名(源) :”; //输入源文件名
cin>> filename1 ;
cout<<"请输入文件名(目的) :"; //输入目标文件名
cin>> filename2;
f1.open(filenamel,ios::in) ; //打开源文件,用于读取
f2.open (filename2, ios::out) ; //打开目标文件,用于写入
while(!f1.eof())
f1.getline(content,128) ; //读取文件中 数据
f2<<content< <endl ;
//将数据写入目标文件
f1.close() ;
f2.close() ;
}
3、文件流状态检查
C++文件流类从ios_base类那里继承了一个流状态成员。这个流状态成员指出流状态的信息:一切顺利,已达文件尾,I/O操作失败等。例如: fail(); is _open(); eof()。
4、使用临时文件
软件开发过程中,经常需要使用临时文件。临时文件的存在是短暂的,必须受程序控制。在C++中,创建临时文件、复制另一个文件的内容并删除文件其实都很简单。首先,需要为临时文件制订一个命名方案,确保每个文件都被指定为独一无二 的文件名。cstdio 库函数中声明的tmpnam()标准函数可以帮助您。函数原型如下:
char* tmpnam(char * pszname )
tmpnamn()函数创建-一个临时文件名(注意: 仅仅产生-一个文件名),将它放在pszname指向的C风格字符串中。常量L tmpnam和TMP MAX限制了文件名包含的字符数,以及在确保当前目录中不生成重复文件名的情况下,tmpnam()可以被调用的最多次数。临时文件的使用方法见下面代码。
提示:在例1-12的代码中,头文件cstio其实是原C语言中的头文件stdio.h,变量TMP_ MAX在本例中值为32767,表明临时文件名字符长度的变量L__tmpnam 的值在本例中是14。文件名是随机产生的,所有的临时文件输出到屏幕上。
#include <iostream>
#include. <cstdio>
void main()
{
using namespace std;
cout<<"This system can generate up tp "<<TMP_ MAX<<" temporary names of up to "<<L
tmpnam<<" characters. \n";
char pszName[L_tmpnam] = {'\0'};
cout<<"Here are ten names :\n";
for(int i=0;i<10;i++)
tmpnam(pszName); //生成临时文件名
cout<<pszName<<endl ;
]
return;
}
总结:
如果对C语言中的文件操作已经熟练,那么理解上面所说的应该是比较轻松的。唯一不同的是,在C++中使用了模板库和常用的I/O类。读者可以执行附例中的可执行程序,或者重新编译源文件之后执行,体验一下产生临时文件名的过程。