1 C语言对文件操作的支持
在C语言中,对文件的操作是利用FILE结构体进行的。
2 C++对文件操作的支持
在C++中,向文件中写入数据可以使用ofstream类实现,读取数据可以使用ifstream类实现。
3 Win32API对文件操作的支持
Win32API提供了与文件操作相关的函数,这些函数功能强大,利用CreateFile、ReadFile和WriteFile函数完成文件的创建、打开、写入和读取。
4 MFC对文件操作的支持
MFC中提供的支持文件操作的基类是:CFile,该类提供了没有缓存的二进制格式的磁盘文件输入输出功能,通过其派生类能够简介的支持文本文件和内存文件。
1.1 文件的打开(fopen)
FILE *fopen(const char * Filename, const char *Mode);
第一个参数(Filename)指向文件名字符串的常量指针类型,表明将要打开的文件;第二个参数(Mode)指定文件打开的模式。
文件打开模式 |
意义 |
r |
为读取而打开,如果文件不存在或不能找到,读取失败。 |
w |
为写入操作打开一个空文件,如果给定的文件已经存在,将被清空。 |
a |
为写入操作打开文件,如果文件已经存在,那么在该文件尾部添加新数据,在写入新数据之前不会移除文件中已有的EOF标记,如果文件不存在,那么首先创建这个文件。 |
r+ |
打开文件用于写入操作和读取操作,文件必须存在。 |
w+ |
为写入操作和读取操作打开一个空的文件。如果给定文件已经存在,那么它的内容将被清空。 |
a+ |
打开文件用于读取操作和添加操作。如果文件不存在,那么首先将创建这个文件。 |
1.2 文件的写入(fwrite)
size_t fwrite(constvoid * buffer, size_t size, size_t count, FILE * _File);
buffer -指向将要被写入文件的数据;
size -以字节为单位的项的大小,实际上就是unsigned integer类型;
count -将要被写入项的最大数目;
stream -指向FILE类型的指针,该指针通过fopen函数获取。
注:C语言对文件的操作使用了缓冲文件系统。
1.3文件的关闭(fclose)
使用fclose函数关闭文件,表示对文件的写入操作已经完成,系统会把缓存中的内容写入磁盘中的文件中。
1.4 fflush函数
希望每次对文件操作之后不关闭它,但仍能将缓冲区中的数据写入磁盘文件中,可以使用另一个C函数:fflush,该函数的作用是将缓冲区的数据写入到磁盘中。
1.5 文件指针定位
当调用文件写入函数想文件中写入数据后,还可以再次写入其他数据。在第二次调用fwrite函数时,利用C语言中的fseek函数把文件指针从当前位置移动到指定的位置。
int fseek(FILE * stream, long offset, int origin);
stream -指向FILE结构体指针;
offset -设定偏移量;
origin -指定文件指针的起始位置。
取值 |
说明 |
SEEK_CUR |
从文件指针当前位置处开始 |
SEEK_END |
从文件的结尾处开始 |
SEEK_SET |
从文件的开始处开始 |
1.6 文件的读取(fread)
size_t fread(constvoid * buffer, size_t size, size_t count, FILE * _File);
利用C语言提供的函数实现文件的读取操作:
运行程序,消息框中会显示一串乱码。应注意,在C语言中,字符串是以\0符号结束的,在显示字符串时,系统会寻找\0字符。在程序中定义的100个元素的数组:ch,数据是随机的,可能有许多数据都是不可读的,由于其中没有找到\0字符,结果我们在消息框中就会看到乱码。
FILE * pFile = fopen("1.txt","w"); char ch[100]; fread(ch,1,100,pFile); fclose(pFile);
MessageBox(ch);
解决方案:
方法一:
FILE * pFile = fopen("1.txt","w"); char buf[22] = "http://www.sunxin.org"; buf[21]= '\0'; fwrite(buf,1,22,pFile); fclose(pFile);
方法二:
FILE * pFile = fopen("1.txt","r"); char ch[100]; memset(ch,0,100); fread(ch,1,100,pFile); fclose(pFile); MessageBox(ch);
方法三:
FILE * pFile = fopen("1.txt","r"); char *pBuf; fseek(pFile,0,SEEK_END); int len = ftell(pFile); pBuf= new char[len + 1]; rewind(pFile); fread(pBuf,1,len,pFile); pBuf[len]= 0; fclose(pFile); MessageBox(pBuf);