前面我们了解到标准I/O库函数的文件有两个处理方式:缓冲文件系统和非缓冲文件系统。由于标准的ANSI决定不采用非缓冲文件系统,而只采用缓冲文件系统,即既使用缓冲文件系统处理文本文件,也使用它来处理二进制文件。也就是将缓冲文件系统扩充为可以处理二进制文件。
缓冲系统自动地在内存区为每个正在使用的文件开辟一个缓冲区,文件的存取都是通过缓冲区进行的。缓冲区相当于一个中转站,它的大小由具体的C版本规定,一般为512字节。当从内存向磁盘输出数据时,先将数据送到内存缓冲区,待缓冲区装满后,再一起送到磁盘文件保存;当从磁盘文件读入数据时,则一次从磁盘文件中将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。
1、文件的创建与打开
打开文件实际上是建立文件的各种有关信息,并使文件指针指向该文件,以便进行其它各种操作。关闭文件则是断开指针与文件之间的联系,也就禁止再对该文件进行操作。关闭文件则是断开指针与文件之间的联系,也就禁止再对该文件进行操作。
ANSIC规定了标准输入输出函数库,用fopen()函数来实现打开文件。该函数是指针型函数,调用后返回文件类指针。有两个函数参数,都是字符型指针。
需要头文件:#include<stdio.h>
函数的原型:FILE* fopen(char *filename,char*mode)
函数参数: filename,字符串形式表现的文件名,这个字符串可以是一个合法的带有路径的文件名;mode,对文件的操作模式,如下表所示。
表 1 文件操作模式
类型 | 含义 | 文件不存在时 | 文件存在时 |
r | 以只读方式打开一个文本文件 | 返回错误标志 | 打开文件 |
w | 以只写方式打开一个文本文件 | 建立新文件 | 打开文件,原内容清空 |
a | 以追加方式打开一个文本文件 | 建立新文件 | 打开文件,只能从文件尾向文件追加数据 |
r+ | 以读/写方式打开一个文本文件 | 返回错误标志 | 打开文件 |
w+ | 以读/写方式建立一个新的文本文件 | 建立新文件 | 打开文件,原文件内容清空 |
a+ | 以读/写方式打开一个文本文件 | 建立新文件 | 打开文件,可从文件中读取或往文件中写入数据 |
rb | 以只读方式打开一个二进制文件 | 返回错误标志 | 打开文件 |
wb | 以只写方式打开一个二进制文件 | 建立新文件 | 打开文件,原文件内容清空 |
ab | 以追加方式打开一个二进制文件 | 建立新文件 | 打开文件,从文件尾向文件追加数据 |
rb+ | 以读/写方式打开一个二进制文件 | 返回错误标志 | 打开文件 |
wb+ | 以读/写方式打开一个新的二进制文件 | 建立新文件 | 打开文件,原文件内容清空 |
ab+ | 以读/写方式打开一个二进制文件 | 建立新文件 | 打开文件,可从文件读取或往文件中写入数据 |
函数返回值:调用成功则返回指向被打开文件的文件指针。否则,返回NULL。通常我们通过函数的返回值来判断函数调用是否成功。
例:文件的打开
#include <stdio.h>
#include <stdlib.h>
main()
{
FIEL* pFile ;
if(pFile = fopen("file.c", "r") == NULL)
{
printf("File open failed… \n");
exit(0);
}
else
{
printf("File open successful… \n");
fclose(pFile);
}
}
对于文件使用方式有以下几点需要说明的:
(1) 文件使用方式由r、w、a、t、b、+六个字符拼成,各字符的含义是 :r(read)读 w(write)写a(append)-追加t(text)-文本文件,可省略不写b(binary)-二进制文件+读和写
(2) 用“r”打开一个文件时,该文件必须已经存在,且只能从该文件中读出。
(3) 用“w”打开的文件只能向该文件写入。若打开的文件已经存在,则将该文件删除,重建一同名新文件;若打开的文件不存在,则以指定的文件名建一新文件。
(4) 以“a”方式打开的文件,主要用于向其尾部添加(写)数据。此时,该文件应存在,打开后,位置指针指向文件尾。如所指文件不存在,则创建一个新文件。
(5) “r+”、“w+”、“a+”方式打开的文件,既可以读入数据,也可以输出数据。“r+”方式时,文件应存在。“w+”方式是新建文件(同“w”方式),操作时,应先向其输出数据,有了数据后,也可读入数据。而“a+”方式,不同于“w+”方式,其所指文件内容不被删除,指针至文件尾,可以添加,也可以读入数据。若文件不存在,也可用其新建一文件。
(6) 打开文件操作不能正常执行时,函数fopen()返回空指针NULL(其值为0),表示出错。出错原因大致为:以“r”、“r+”方式打开一个并不存在的文件、磁盘故障、磁盘满、无法建立新文件等。
(7) 如果不能实现打开指定文件的操作,则fopen()函数返回一个空指针NULL (其值在头文件stdio.h中被定义为0)。
(8) “r(b)+”与“a(b)+”的区别:使用前者打开文件时,读写位置指针指向文件头;使用后者时,读写指针指向文件尾。
(9) 使用文本文件向计算机系统输入数据时,系统自动将回车换行符转换成一个换行符;在输出时,将换行符转换成回车和换行两个字符。使用二进制文件时,内存中的数据形式与数据文件中的形式完全一样,就不再进行转换。
(10) 有些C编译系统,可能并不完全提供上述对文件的操作方式,或采用的表示符号不同,请注意所使用系统的规定。
(11) 在程序开始运行时,系统自动打开三个标准文件,并分别定义了文件指针:
① 标准输入文件——stdin:指向终端输入(一般为键盘)。如果程序中指定要从stdin所指的文件输入数据,就是从终端键盘上输入数据。
② 标准输出文件——stdout:指向终端输出(一般为显示器)。
③ 标准错误文件——stderr:指向终端标准错误输出(一般为显示器)。
2、文件的关闭
调用该函数后的功能是断开由fopen()函数建立的文件指针fp与其相应文件的联系,释放它所占的内存缓冲区和相应的文件类型结构体变量所占的内存,使得原来的指针变量不再指向该文件。此后就不可以通过该指针来访问这个文件。
需要头文件:#include<stdio.h>
函数的原型:int fclose(FILE * pFile)
函数的参数: pFile指向文件的文件指针。调用这个函数使文件指针变量与文件“脱钩”,释放文件结构体和文件指针。从而释放内存空间。
函数返回值:函数调用成功,关闭文件并返回0。否则(如磁盘空间不足、写保护或关闭已经关闭的文件)返回EOF,即-1。
#include<stdio.h>
#include <stdlib.h>
#define NULL 0
FILE* fp;
if(( fp = fopen("文件名","文件使用方式")) == NULL)
{
printf("file can not open!\n");
exit(0);
}
┇
fclose(fp);
我们团队有着十几年的期货程序化交易算法与软件研发经验,基于C++ Qt技术研发了具有自主知识产权的期货智能程序化交易一体化系统平台,该平台封装了二百多个量化指标,具有低时延、高性能、小滑点、可定制和跨平台的特点。团队致力于将人工智能技术与传统的程序化交易技术相结合为客户提供灵活可定制的期货智能程序化交易服务和产品。
2012年9月26日于北京邮电大学学八楼629