文件打开后就可以对文件进行读/写操作。对文件的读和写操作是最常用的文件操作。C语言提供了多种向文件读/写的库函数,如fscanf ()和fprintf ()函数、fgetc ()和fputc ()函数、fgets()和fputs ()函数、fread ()和fwrite ()函数等。
1.字符读/写函数fgetc( )和fputc ( )
字符读/写函数是以字符为单位的读/写函数。每次可从文件读出或向文件写入一个字符。
(1) fgetc ()函数的功能是从指定的磁盘文件中读一个字符,其调用的一般形式为:
例如:ch = fgetc (fp) ;
fp是fopen ()函数的返回指针,fgetc ( fp)表示函数从指针变量fp指定的文件中读取一个字符并赋给变量ch,若执行fgetc ()函数时遇到文件结束符EOF,则函数返回一个值-1给ch。这个-1不是函数读入的字符值,因为没有字符的ASCII码为-1。
在fgetc ()函数的使用中,文件内部有一个位置指针,用来指向文件的当前读/写字节。在打开文件时,该指针总是指向文件的第一个字节。使用fgetc ()函数后,该位置指针将向后移动一个字节,因此可连续多次使用fgetc ()函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读/写位置,每读/写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。
例12.1 显示从文件中读取的字符。
编写程序:
创建一个名为“eg12_1.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
1)本例中通过fopen ()函数以只读的方式打开文件E:\\eg12_1.txt,如果打开文件成功,函数的返回值为该文件所建立数据区的起始地址,并把它赋值给指针变量fp。如果不能成功打开文件,则显示“file can not open”,然后调用exit ()函数终止函数运行。
2)使用fgetc ()函数读取fp所指向文件的一个字符,如果是EOF说明文件结束,不执行循环体;如果不是EOF,则执行循环体。利用putchar ( )函数在屏幕上输出字符,再利用fgetc ()函数读入下一个字符。每读一次,文件内部的位置指针向后移动一个字符,如此反复执行,直到读入EOF为止。通过执行本程序将显示整个文件的内容。文件使用完毕,通过fclose ()函数关闭文件,避免数据丢失。
(2) fputc ()函数的功能是把一个字符写入指定的文件中,其调用的一般形式为:
例如:fputc ( 'c' , fp) ;
该函数把字符常量c写入到由指针变量fp所指定的文件中。
使用fputc ()函数要求被写入的文件以写、读写或追加方式打开。用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件的内容,希望写入的字符从文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。在写入的过程中,每写入一个字符,文件内部位置指针将向后移动一个字节。同时,fputc ()函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF,可以此来判断写入是否成功。
例12.2 将一个文件中的字符写入到另一个文件中。
编写程序:
创建一个名为“eg12_2.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本例中定义了两个文件指针变量fp和fp1,fp指向以只读方式打开的文件eg12_1.txt,fp 1指向以只写方式打开的文件eg12_2.txt。
调用fgetc ()函数读取fp所指向文件的一个字符,如果是EOF说明文件结束,不执行循环体;如果不是EOF,则执行循环体。利用putchar ()函数在屏幕上输出字符,同时将字符输出到文件eg12_2.txt中,再利用fgetc ()函数读入下一个字符。如此循环往复,直到读入EOF为止。
2.字符串读/写函数fgets( )和fputs ( )
fgetc ()和fputc ()函数是向文件中读/写一个字符。如果字符个数很多,单个字符的读/写显得非常麻烦,因此考虑是否能一次读/写一个字符串,于是产生了字符串的读/写函数fgets ()和fputs ( ) 。
(1) fgets ()函数的功能是从指定的文件中读一个字符串到字符数组中,其调用的一般形式为:
例如:fgets (str, n , fp) ;
该函数表示从文件指针变量fp所指向的磁盘文件中读入一个长度为n-1的字符串,并在字符串后加字符串结束标志'\0'字符,然后将这n个字符存到字符数组str中。
说明:如果读入n-1个字符完成之前就遇到换行符'\n'或者文件结束符EOF,将停止读入数据,但会将遇到的'\n'作为一个字符也送入字符数组str中。fgets ()函数执行完,将返回一个指向该字符串的指针,即指向字符数组的首地址。如果读到文件尾或出错,则返回一个空值NULL。程序中可以使用ferror()函数和feof()函数来测定是读出出错还是到了文件末尾。
例12.3 逐行读出文件中的字符。
编写程序:
创建一个名为“eg12_3.c”的新文件,在编辑窗口中输入下面的程序代码。
eg12_3.txt存储数据:
运行结果:
程序说明:
本例中定义了文件指针变量fp,利用fopen ( )函数打开文件E:\\eg12_3.txt。该文件的内容如上图eg12_3.txt存储数据所示。因为题目为读取文件中的前10行,因此设置循环10次,每次调用fgets ()函数从fp所指向文件中取出一行,一行定义为64个字符,放到字符数组buf中,同时将buf字符数组中的内容输出。(www.daowen.com)
(2) fputs ()函数的功能是向指定的文件写入一个字符串,其调用的一般形式为:
例如:fputs ( " string" , fp) ;
该函数将字符串string写入到文件指针变量fp所指向的文件中。其中fputs ()函数中的字符串可以是字符串常量,也可以是字符数组名或指针变量。
例12.4 将一组字符串写入文件并读出显示。
编写程序:
创建一个名为“eg12_4.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本例中定义了文件指针变量fp,首先调用fopen ()函数以只写的方式打开文件E:\\eg12_4.txt。然后利用fputs ()函数将二维数组str中的每个字符串写入指针fp指定的文件中。完成写入操作后,该文件的内容如上图eg12_4.txt所示,此时写入完毕应关闭文件。接着调用fopen ()函数以只读的方式打开文件E:\\eg12_4.txt,调用fgets ()函数实现将fp所指文件的内容复制到数组str1中。因为str1中每行能存放30个字符,因此从文件读出的每行字符不能超过29个,读出后在字符串末尾加上'\0',为了防止数据丢失,关闭已打开的文件。最后利用循环输出二维数组中每行的字符串。
3.数据块读/写函数fread ( )和fwrite ( )
前面介绍了向文件中读/写一个字符和字符串的函数,如果要求一次读/写一组数据,例如读/写数组中的元素和结构体变量等数据时,单个字符和字符串的读/写非常不方便,因此考虑是否能一次读/写一个数据块,于是就有了数据块读/写函数fread ()和fwrite ( ) 。
(1) fread ()函数的功能是从指定的文件中读一个数据块,其调用的一般形式为:
(2) fwrite ()函数的功能是将数据块写入指定文件中,其调用的一般形式为:
其中,buffer是一个指针,在fread ()函数中,它表示存放输入数据的首地址;在fwrite ()函数中,它表示存放输出数据的首地址;size表示一个数据块的字节数;count表示要读/写的数据块数;fp表示文件指针。
例如:fread(f,4,3,fp);
该函数表示从fp所指的文件中读取4个字节的3个数据块,并存储到数组f中。
fwrite (buf,4,3,fp) ;
该函数表示从数组名buf代表的数组起始地址开始,输出长度为4个字节的3个数据块,并将它们写入到由fp指定的磁盘文件中。
例12.5 将结构体写入文件并读出。
编写程序:
创建一个名为“eg12_5.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本例中定义了一个struct student类型的结构体,该类型包含num, name, tel这3个成员。因为要处理3个学生的信息,因此定义了struct student类型的数组stu[3]。调用scanf()函数给数组成员赋值,再调用fwrite ()函数将struct student类型的数组元素写入指针fp指定的文件中。该文件的内容如图eg12_5.txt所示。调用fread ()函数读取fp指向的文件中struct student类型的数据存储到数组元素stu [ i ]中,利用循环将数组stu的各个元素输出显示到屏幕。
4.格式化读/写函数fscanf ( )和fprintf ( )
在很多实际应用中需要按照规定格式进行读/写操作,fscanf ()函数和fprintf ()函数与前面使用的scanf()和printf()函数的功能相似,都是格式化读/写函数。区别在于fscanf( )函数和fprintf ()函数的读/写对象不是键盘和显示器,而是磁盘文件。
fscanf()函数和fprintf()函数调用的一般形式为:
例如:fscanf ( fp, " % d% s" ,&i,s) ;
若文件指针fp已指向一个已经打开的文本文件,i为整型变量,s为字符数组,通过此语句完成从fp所指的文件中读入一个整数和一个字符串,分别放入变量i和s中。
fprintf(fp,"%d%c" ,j,ch) ;
同样,若文件指针fp已指向一个已经打开的文本文件,j为整型变量,ch为字符型变量,通过此语句完成将j以%d格式,ch以%c格式输出到fp所指的文件中。
例12.6 使用格式化读/写函数实现例12.5 。
编写程序:
创建一个名为“eg12_6.c”的新文件,在编辑窗口中输入下面的程序代码。
运行结果:
程序说明:
本例中其他语句与例12.5 相同,fscanf()和fprintf ()函数每次只能读/写一个结构体数组元素,因此采用了循环语句来读/写全部的数组元素。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。