1 C文件的有关概念
1.1 什么是文件
在进行C运用程序设计中,主要用到两种文件: (1)程序文件。包括程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等,用来存放程序的。 (2)数据文件。供程序运行时读入内存的数据。 文件指存储在外部介质上数据的集合。 输入输出是数据传送的过程,输入输出形象地称为流,即输入输出流。流表示了信息从源到目的的流动。
1.2 文件名
文件标识包括三部分: (1)文件路径。表示文件在外部存储设备中的位置。 (2)文件名主干的命名规则遵循标志符的命名规则。 (3)后缀用来表示文件的性质,一般不超3个字符,如:.doc,.txt…
1.3 文件的分类
数据文件可分为ASCII文件和二进制文件。ASCII文件又称文本(txt)文件。
1.4 文件缓冲区
C语言采用缓冲文件系统处理文件,缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区。 C编译系统提供了一些标准输入输出函数,用来对文件进行读写。
1.5 文件类型指针
文件类型指针,简称文件指针。 定义FILE结构体类型的信息包含在头文件“stdio.h”中。在程序中可以直接用FILE类型名定义变量。如:
FILE f;//类比int a;
定义一个指向文件型数据的指针变量:
FILE *fp;
定义fp为一个指向FILE类型变量的指针变量。使fp指向某一个文件的文件信息区,通过文件信息区中的信息能够访问该文件,即通过文件指针变量能够找到与它相关的文件,将这种指向文件信息区的指针变量称为指向文件的指针变量。 指向文件的指针变量是指向内存中的文件信息区的开头。
2 文件的打开和关闭
对文件读写之前应该打开文件,在使用结束之后应关闭该文件。 打开是指为文件建立相应的信息区和文件缓冲区。 关闭是指撤销文件信息区和文件缓冲区。
2.1 用fopen函数打开数据文件
fopen函数的调用方法为
fopen(文件名,使用文件方式);
例如:
fopen("a1","r");
表示要打开名字为“al”的文件, 使用文件的方式为“读入”(r代表read, 即读入) 。fopen函数的返回值是指向al文件的指针(即al文件信息区的起始地址) 。 通常将fopen函数的返回值赋给一个指向文件的指针变量。如:
FILE *fp;
fp=fopen("a1","r");
fp指向了a1文件。 使用文件的方式 (1)最基本的是最前面的"r"、“w”、"a"三种方式。在其后加“b”表示是二进制文件, 不加“b”的表示是ASCII文件(即文本文件) 。加“+”表示既可读又可写。 (2) 如果不能实现“打开”的任务, fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义为0) 。 常用下面的方法打开一个文件:
if((fp=fopen("a1","r"))==NULL)
{
printf("can not open this file\n");
exit(0);
}
编译系统先检查打开的操作有否出错, 如果有错就在终端上输出“can not open this file”。exit函数的作用是关闭所有文件, 终止正在执行的程序, 待用户检查出错误, 修改后再运行。
2.2 用fclose函数关闭文件
关闭文件用fclose函数,fclose函数形式为:
fclose(文件指针);
例如:
fclose(fp);
前面曾把打开文件(用fopen函数) 时所带回的指针赋给了fp,现在把fp指向的文件关闭,此后fp不再指向该文件。 应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件可能会丢失数据。 fclose函数也带回一个值, 当顺利地执行了关闭操作, 则返回值为0; 否则返回EOF(一1) 。
3 文件的顺序读取
顺序读写,对文件读写数据的顺序和数据在文件中的物理顺序是一致的。
3.1 向文件读写字符
读写一个字符的函数 例题: 从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“#”为止。 思路: 从键盘输入字符,然后用fputc函数写到磁盘文件。 编写程序:
#include
#include
int main(){
FILE *fp;//定义指向文件的指针变量
char ch,filename[10];//定义字符ch和字符数组filename
printf("请输入所用的文件名:");
scanf("%s",filename);//输入文件名
if((fp=fopen("filename","w"))==NULL)//如果打开时出错,就输出“打不开”信息
{
printf("无法打开此文件\n");
exit(0);//终止程序
}
ch=getchar();//ch用来接收在执行scanf语句时最后输入的回车符
printf("请输入一个准备存储到磁盘的字符串(以#结束):");
ch=getchar();//接收从键盘输入的第一个字符
while(ch!='#')//当输入“#”时结束循环
{
fputc(ch,fp);//磁盘文件输出一个字符
putchar(ch);//将输入的字符显示在屏幕上
ch=getchar()