|
C语言对文件的操作
C语言把文件看作是一个字符(字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据数据的组织形式,可分为ASCⅡ文件和二进制文件。
ASCⅡ文件:又称文本文件,它的每一个字节放一个ASCⅡ代码,代表一个字符。用ASCⅡ形式输出与字符一一对应,因而便於对字符进行逐个处理,也便於输出字符,但一般占存储空间较多,而且要花费转换时间。
二进制文件:是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。用二进制输出数值,可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。一般中间结果数据需要暂时保存在外存上以后又需要输入到内存的,常用二进制保存。
一个整数10000,在内存中占两个字节,如果按ASCⅡ形式输出,则占5个字节,而按二进制输出,则只占2个字节。
流文件:一个C文件就是一个字节流或二进制流。它把数据看作是一连串的字符,而不考虑记录的界限。在C语言中对文件的存取是以字符(字节)为单位的。输入输出的数据流的开始和结束仅受程序控制而不受物理符号(如回车)控制。我们把这种文件称为“流文件”。
缓冲文件系统:系统自动地在内存区为每一个正在使用地文件开辟一个缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然后再从缓冲区逐个地将数据送到程序数据区。
文件类型指针
每一个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前状态)。这些信息保存在一个结构体类型的变量中。该结构体类型是由系统定义的,取名为FILE。 有了FILE类型后,可以用它来定义若干个FILE型的变量,以便存放若干个文件的信息。可以定义文件型指针变量。
fp是一个指向FILE类型结构体的指针变量。可以使fp指向某一个文件的结构体变量,从而通过该结构变量中的文件信息能够访问该文件。也就是说,通过文件指针变量能够找到与它相关的文件。
文件的打开与关闭
1.文件的打开(fopen函数)
ANSI C规定了标准的数入输出函数库,用fopen()函数来实现打开文件。fopen()函数的调用方式通常为:
FILE *fp; fp=fopen(文件名,使用文件方式) fp=fopen("A1","r") | 它表示:要打开名字为A1的文件,使用文件方式为“读入”,fopen()函数带回指向A1文件的指针并赋给fp,这样fp和A1相联系了。
| 文件使用方式 |
含义 |
| "r"(只读) |
为输入打开一个文本文件 |
| "w"(只写) |
为输出打开一个文本文件 |
| "a"(追加) |
向文本文件尾增加数据 |
| "rb"(只读) |
为输入打开一个二进制文件 |
| "wb"(只写) |
为输出打开一个二进制文件 |
| "ab"(只写) |
向二进制文件尾增加数据 |
| "r+"(读写) |
为读/写打开一个文本文件 |
| "w+"(读写) |
为读/写建立一个新的文本文件 |
| "a+"(读写) |
为读/写打开一个文本文件 |
| "rb+"(读写) |
为读/写打开一个二进制文件 |
| "wb+"(读写) |
为读/写建立一个新的二进制文件 |
| "ab+"(读写) |
为读/写打开一个二进制文件 | 2.文件的关闭(close函数)
在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量不再指向该文件,使该文件指针变量与“文件”脱勾。
应该养成在程序终止之前关闭所有的文件的习惯,如果不关闭文件将会丢失数据。
文件的读写
1.fputc函数
fputc函数把一个字符写到磁盘文件上。
其中ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量,它从fopen函数得到返回值。它的作用是将字符ch的值输出到fp所指的文件上去。
2.fgetc函数
fgetc函数从指定文件读入一个字符,该文件必须是以读或读写方式打开的。
fp是文件指针变量,ch为字符变量。fgetc函数带回一个字符,赋给ch。
3.fread函数和fwrite函数
fread函数和fwrite函数用来读写一个数据块。
fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); | buffer:是一个指针。对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。 size:要读写的字节数。 count:要进行读写多少个size字节的数据项。 fp:文件型指针。
其中f是一个实型数组名。一个实型变量占4个字节。这个函数从fp所指向的文件读入2次(每次4个字节)的数据,存储到数组f中。
4.fprintf函数fscanf函数
fprintf函数和fscanf函数和printf函数、scanf函数作用相仿,都是格式化读写函数。只有一点不同,fprintf和fscanf函数的读写对象不是终端而是磁碟文件。
fprintf(文件指针,格式字符串,输出表列); fscanf(文件指针,格式字符串,输入表列); |
| fprintf(fp,"%d,%6.2f",i,t); | 它的作用是将整型变量i和实型变量t的值按%d和%6.2f的格式输出到fp指向的文件上。 用fprintf函数和fscanf函数对磁盘文件进行读写,使用方便,容易理解。但由於在输入时要将ASCⅡ码转换为二进制形式,在输出时又要将二进制形式转换成ASCⅡ码,花费时间较多。
文件的定位
文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移到下一个字符位置。如果想改变这样的规律,强制使位置指针指向其他指定的位置,可以用有关函数。 1.rewind函数 rewind函数的作用是使位置指针重新返回文件的开头。
2.fseek函数和随机读写
所谓随机读写,是指读完上一个字符后,并不一定要读写其后续的字符,而可以读写文件中任意所需的字符。
“起始点”用0、1、2表示,0代表文件开始,1为当前位置,2为文件末尾。“位移量”指以“起始点”为基点,向前移动的字节数。大多数版本要求位移量为Long型数据,这样当文件的长度大於64k时不至於出问题。
fseek(fp,100L,0); 将位置指针移到离文件头100字节处。 | 3.ftell函数 ftell函数的作用是得到流式文件中的当前位置,用相对於文件开头的位移量来表示。如果ftell函数的返回值为-1L,表示出错。
出错的检测
1.ferror函数
在调用各种输入输出函数时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。如果ferror返回值为0,表示未出错,如果返回一个非零值,表示出错。在执行fopen函数时,ferror函数的初始值自动设置为0。 2.clearerr函数
它的作用是使文件错误标志和文件结束标志置为0。假设在调用一个输入输出函数时出现错误,ferror函数值就为一个非零值,在调用clearerr后,ferror的值变为0。
|
 |
|
【例1】从键盘输入一些字符,逐个把它们送到磁盘上,直到输入一个“#”为止。
#include < stdio.h >
main()
{FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{printf("cannot open file\n");
exit(0);
}
ch=getchar();
while(ch!='#')
{
fputc(ch,fp),putchar(ch);
ch=getchar();
}
fclose(fp);
} |
| 上面的程序运行情况如下 |
file1.c (输入磁盘文件名)
computer and c# (输入一个字符串)
computer and c
| 【例2】将一个磁盘文件中的信息复制到另一个磁盘文件中。
#include < stdio.h >
main()
{FILE *in,*out;
char ch,infile[10],outfile[10];
printf("Enter the infile name:\n");
scanf("%s",infile);
printf("Enter the outfile name:\n");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL)
{printf("cannot open infile\n");
exit(0);
}
if((out=fopen(outfile,"w"))==NULL)
{printf("cannot open outfile\n");
exit(0);
}
while(!feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);
} |
| 上面的程序运行情况如下 |
Enter the infile name:
file1.c(输入原有磁盘文件名)
Enter the outfile name:
file2.c(输入新复制的磁盘文件名)
|
【例2】在磁盘文件上存有10个学生的数据。要求将第1、3、5、7、9个学生数据输入计算机。
#include < stdio.h >
struct student_type
{
char name[10];
int num;
int age;
char sex;
}stud[10]
main()
{int i;
FILE *fp;
if((fp=fopen("stud_dat","rb"))==NULL;
{
printf("cannot open file\n");
exit(0);
}
for(i=0;i<10;i+=2)
{
fseek(fp,i*sizeof(struct student_type),0);
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("%s%d%d%c\n",stud[i].name,stud[i].num,
stud[i].age,stud[i].sex);
}
fclose(fp);
} | |
|
|
|
发表于: 2008-03-14 ,修改于: 2008-03-14 14:54,已浏览298次,有评论1条
推荐
投诉
|
|
| |