这两天要用到文件系统Fatfs,所以又把C语言书翻粗来看看文件相关的操作函数。(书籍真是人类的好朋友!)
数据常常需要从一个位置“流向”另一个位置,这种数据的流动称为”流“,每个具体的数据流动总是和设备和外部介质有关,这些设备和介质统称为文件。
每一个文件对应一个文件指针,如键盘对应stdin,显示器对应stdout,打印机对应sprn,数据的流动通过文件指针与一个具体的设备或介质相连。
流的数据组织形式分为字符序列和字节序列,前者称为文本流,后者称为二进制流。一个实数136467.56789,如果作为字符序列,共占12byte。如果作为一个实数,就是二进制流,所占空间都是确定的4byte.与文本流和二进制流对应的磁盘文件分别称为文本文件和二进制文件。
关于磁盘的读写要详细的了解的话就得看看磁盘的结构了,把磁盘的结构搞明白了才能理解它的读写过程,这里不花篇幅去讲解了,另见磁盘详解。
每次从磁盘读写文件不仅效率低,而且移动磁头、寻找磁道扇区,对磁盘也有很大的损坏。因此在内存中开出一块输入文件缓冲区、输出文件缓冲区。将读取一个吻需要的信息存放在一个结构体中:struct FILE
{
short level; //缓冲区满或空的程度
unsigned flags; // 文件状态标志
char fd; // 文件描述符
unsigned char hold; //若无文件缓冲区,则不读取数据
short bsize; // 文件缓冲区大小
unsigned char *buffer; //文件缓冲区位置
unsigend char *curp; //指向文件缓冲区当前数据的指针
unsigned istemp; //临时文件指示器
short token; //用于有效性检验
};
程序用到一个文件,需要系统在内存建立一个文件缓冲区,并返回一个文件指针,我们称之为打开文件。
例: FILE *fp;
fp = fopen("D:\\record\\s.txt","r");
打开D盘record目录下的名为s.txt的文本文件,从中读取数据。注:双斜杠的第一个斜杠是转义字符。文件使用方式有(r:只读方式打开一个文本文件 w:只写方式打开一个文本文件 a:追加方式写一个文本文件 r+:读写方式打开一个文本文件 w+:读写方式创建一个文本文件 a+:读写追加方式打开一个文本文件)。对于二进制文件,形如rb等等,不再赘述。
文件没有打开,fopen会返回一个空指针值NULL,并且在文件使用之后,需要释放文件缓冲区。因此一个安全的程序应该这样写:
FILE *fp;
if(! if(fp = fopen("D:\\record\\s.txt","r")))
{
printf("cannot open file s.txt\n");
exit(1);
}
else
{
...
fclose(fp);
}
关于文件读写的函数有很多,主要分为文本文件的字符读写、字符串读写,二进制文件的二进制无格式读写,键盘文件和显示器文件的格式读写等,大家自行百度吧,不再挨个讲解。
关于文件复制,这是大家最常用的文件操作,最简单的方法是逐字符复制。为了使复制通用化,用户可以写个子函数来使自己指定源文件和目标文件。