首页 理论教育C语言程序设计:文件的读写操作

C语言程序设计:文件的读写操作

【摘要】:例9.2中的程序是按处理文本文件的方式来编写的。在文件内部有一个位置指针,用来指向文件的当前读写字节。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。例9.3将例9.1中的建立的文件A.dat的内容在屏幕上显示。例9.4从A.dat文件中读入一个含10个字符的字符串。例9.6从键盘输入两个学生数据并写入一个文件中,再读出这两个学生的数据显示在屏幕上。

文件打开以后,就可以对文件进行读和写了,读和写是最常用的文件操作。

C语言提供了多种文件读写的函数:

(1)字符读写函数:fgetc()和fputc()。字符读写函数是以字符(字节)为单位的读写函数,每次可从文件读出或向文件写入一个字符。

(2)字符串读写函数:fgets()和fputs()。

(3)数据块读写函数:freed()和fwrite()。

(4)格式化读写函数:fscanf()和fprinf()。

注意:使用以上函数都要求包含头文件stdio.h。

1.写字符函数fputc()

fputc()函数的功能是把一个字符写入指定的文件中,即将字符表达式的字符输出到文件指针所指向的文件。若输出操作成功该函数返回输出的字符,否则返回EOF。函数调用的形式为:

fputc(字符表达式,文件指针);

其中,待写入的字符可以是字符常量或变量。例如fputc(’a’,fp);

其意义是把字符a写入fp所指向的文件中。

注意:

(1)被写入的文件可以用写、读写、追加方式打开。用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件开头开始。如需保留原有文件内容,希望写入的字符从原有文件末尾开始存放,则应以追加方式打开文件。被写入的文件若不存在,则创建该文件。

(2)每写入一个字符,文件内部位置指针向后移动一个字节。

(3)fputc()函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可以利用该返回值来判断写入操作是否成功。

例9.1 从键盘输入一字符串,并逐个将字符串的每一个字符传送至磁盘文件A.dat中,当输入的字符为’#’时停止输入。

例9.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。

例9.2中的程序是按处理文本文件的方式来编写的。也可以用此程序来复制一个二进制文件,只需将两个fopen()函数中的“r”和“w”分别改为“rb”和“wb”即可。

2.读字符函数fgetc()

fgetc()函数的功能是从指定的文件中读一个字符,该字符的ASCII码值作为函数的返回值。若读取字符时文件已经结束或出错,fgetc()函数返回文件结束标记EOF,此时EOF的值为-1。函数调用的形式为:

字符变量=fgetc(文件指针);

例如:

ch=fgetc(fp);

其意义是从打开的文件fp中读取一个字符并传送至ch中。

注意:

(1)在fgetc()函数调用中,读取的文件必须是以读或读写方式打开的。

(2)读取字符的结果也可以不向字符变量赋值。例如:

fgetc(fp);

采取这样的操作,读出的字符不能保存的。

(3)在文件内部有一个位置指针,用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc()函数后,该位置指针将向后移动一个字节。因此可连续多次使用fgetc()函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。

例9.3 将例9.1中的建立的文件A.dat的内容在屏幕上显示。

3.读字符串函数fgets()

fgets()函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:

fgets(字符数组名,n,文件指针);

其中的n是一个正整数,表示从文件中读出的字符串不超过n-1个字符。在读入的最后一个字符后加上串结束标志’\0’。例如:

fgets(str,n,fp);

其意义是从fp所指的文件中读出n-1个字符并传送至入字符数组str中。

例9.4 从A.dat文件中读入一个含10个字符的字符串。(www.chuimin.cn)

本例中定义了一个字符数组str(共11个字节),在以读文本文件方式打开文件A.dat后,从中读出10个字符并传送至str数组,在数组最后一个单元内将加上'\0',然后在屏幕上显示输出str数组。

注意:

(1)在读出n-1个字符之前,如遇到了换行符或EOF,则读取结束。

(2)fgets()函数也有返回值,其返回值是字符数组的首地址

4.写字符串函数fputs()

fputs()函数的功能是向指定的文件写入一个字符串,其调用形式为:

fputs(字符串,文件指针);

其中字符串可以是字符串常量,也可以是字符数组名,或数组型指针变量。字符串末尾的’\0’不输出。若输出成功函数值返回0,失败则为EOF。例如:

fputs(“abcd”,fp);

其意义是把字符串“abcd”写入fp所指的文件之中。

例9.5 在文件A.dat中追加一个字符串。

本例要求在string文件末加写字符串,因此在程序第7行以追加读写文本文件的方式打开文件string。然后输入字符串,并用fputs()函数把该字符串写入文件string。在程序第15行用rewind()函数把文件内部位置指针移到文件首,再使用了循环语句逐个显示当前文件中的全部内容。

5.数据块读写函数fread()和fwrite()

C语言还提供了用于整块数据的读写的函数,可用来读写一组数据(如一个数组元素、一个结构变量的值等)。

读数据块函数调用的一般形式为:

fread(buffer,size,count,fp);

写数据块函数调用的一般形式为:

fwrite(buffer,size,count,fp);

其中,buffer是一个指针。在fread()函数中,buffer表示存放输入数据的首地址。在fwrite()函数中,它表示存放输出数据的首地址。size表示数据块的字节数,count表示要读写的数据块块数,fp表示文件指针。

例如:

fread(fa,4,5,fp);

其意义是从fp所指的文件中,每次读4个字节(1个实数)传送至实数组fa中,并连续读5次,即读5个实数到fa中。

例9.6 从键盘输入两个学生数据并写入一个文件中,再读出这两个学生的数据显示在屏幕上。

#include“stdio.h”

#include“stdlib.h”

struct stu

本例程序中定义了一个结构stu,说明了两个结构数组boya和boyb以及两个结构指针变量pp和qq,pp指向boya,qq指向boyb。程序第16行以读写方式打开二进制文件“stu_list”,然后输入两个学生数据并写入该文件中,然后把文件内部位置指针移到文件首,读出两块学生数据并在屏幕上显示。

6.格式化读写函数fscanf()和fprintf()

fscanf()函数与fprintf()函数与前面使用的scanf()和printf()函数的功能相似,都是格式化读写函数。两者的区别在于:fscanf()函数和fprintf()函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为:

fscanf(文件指针,格式字符串,输入表列);

fprintf(文件指针,格式字符串,输出表列);

例如:

fscanf(fp,“%d%s”,& i,s);

fprintf(fp,“%d%c”,j,ch);

用fscanf()和fprintf()函数也可以完成例9.6的问题。

例9.7 从键盘输入两个学生数据并写入一个文件中,再读出这两个学生的数据显示在屏幕上,请与例9.6比较。

与例9.6相比,本程序中fscanf()和fprintf()函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。还要注意指针变量pp,qq,由于循环改变了它们的值,因此在程序的25行和32行分别对它们重新赋予了数组的首地址。