【时时三省】(C语言基础)用格式化的方式读写文本文件

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省

前面进行的是字符的输入输出,而实际上数据的类型是丰富的。大家已很熟悉用printf函数和scanf函数向终端进行格式化的输入输出,即用各种不同的格式以终端为对象输入输出数据。其实也可以对文件进行格式化输入输出,这时就要用fprintf函数和fscanf函数,从函数名可以看到,它们只是在printf和scanf的前面加了一个字母f。它们的作用与printf函数和scanf函数相仿,都是格式化读写函数。只有一点不同:fprintf和fscanf函数的读写对象不是终端而是文件。它们的一般调用方式为

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

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

例如:

fprintf ( fp," % d,% 6.2f ,i,f );

它的作用是将int型变量i和float型变量f的值按%d和%6.2f的格式输出到fp指向的文件中。若i = 3,f = 4.5,则输出到磁盘文件上的是以下的字符:

3,4.50

这是和输出到屏幕的情况相似的,只是它没有输出到屏幕而是输出到文件而已。

同样,用以下fscanf函数可以从磁盘文件上读入ASCII字符:

fscanf ( fp," % d,% f",& i , &f );

磁盘文件上如果有字符"3 , 4.5",则从磁盘文件中读取整数3送给整型变量i ,读取实数4.5送给float型变量f。

用fprint和fcanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将文件中的ASCII码转换为二进制形式再保存在内存变量中,在输出时又要将内存中的二进制形式转换成字符,要花费较多时间。因此,在内存与磁盘频繁交换数据的情况下,最好不用printf和fscanf函数,而用下面介绍的fread和fwrite函数进行二进制的读写。

用二进制方式向文件读写一组据

在程序中不仅需要一次输入输出一个数据,而且常常需要一次输入输出一组数据(如数组或结构体变量的值),C语言允许用fread函数从文件中读一个数据块,用fwrite函数向文件写一个数据块。在读写时是以二进制形式进行的。在向磁盘写数据时,直接将内存中一组数据原封不动、不加转换地复制到磁盘文件上,在读入时也是将磁盘文件中若干字节的内容一批读入内存。

它们的一般调用形式为

fread ( buffer , size , count , fp ) ;

fwrite ( buffer , size , count , fp ) ;

其中:

buffer:是一个地址。对fread来说,它是用来存放从文件读入的数据的存储区的地址。

对fwrite来说,是要把此地址开始的存储区中的数据向文件输出(以上指的是起始地址)。

size:要读写的字节数。

count:要读写多少个数据项(每个数据项长度为size)。

fp : FILE类型指针。

在打开文件时指定用二进制文件,这样就可以用fread和fwrite函数读写任何类型的信息,

例如:

fread ( f,4,10,fp );

其中,f是一个float型数组名(代表数组首元素地址)。这个函数从fp所指向的文件读入10个4个字节的数据,存储到数组f中。

如果有一个Struct student_type结构体类型:

struct Student_type

{char name[10];

int num;

int age;

char addr[30];

}stud[40];

定义了一个结构体数组stud,有40个元素,每一个元素用来存放一个学生的数据(包括姓名,学号,年龄,地址)。假设学生的数据已存放在硬盘文件中,可以用下面的for语句和fread函数读入40个学生数据:

for(i=0;i<40;i++)

fread(&stud[i],sizeof(struct Student_type),1,fp);

执行40次循环,每次从fp指向的文件中读入结构体数组stu的一个元素。

同样,以下for语句和fwrite函数可以将内存中的学生数据输出到磁盘文件中去:

for ( i = 0;i < 40;i ++)

fwrite ( &stud [i] , sizeof ( struct Student_ type ) , 1 , fp ) ;

fread或fwrite函数的类型为int型,如果fread或fwrite函数执行成功,则函数返回值为形参count的值(一个整数),即输入或输出数据项的个数(今为1)。

相关推荐
qq_401700413 小时前
嵌入式用Unix时间的优势及其C语言转换
服务器·c语言·unix
智者知已应修善业9 小时前
【51单片机普通延时奇偶灯切换】2023-4-4
c语言·经验分享·笔记·嵌入式硬件·51单片机
晚风(●•σ )9 小时前
C++语言程序设计——11 C语言风格输入/输出函数
c语言·开发语言·c++
X***489610 小时前
C源代码生成器
c语言·开发语言
合作小小程序员小小店12 小时前
桌面安全开发,桌面二进制%恶意行为拦截查杀%系统安全开发3.0,基于c/c++语言,mfc,win32,ring3,dll,hook,inject,无数据库
c语言·开发语言·c++·安全·系统安全
oioihoii14 小时前
C++语言演进之路:从“C with Classes”到现代编程基石
java·c语言·c++
历程里程碑17 小时前
各种排序法大全
c语言·数据结构·笔记·算法·排序算法
树在风中摇曳17 小时前
带哨兵位的双向循环链表详解(含 C 代码)+ LeetCode138 深度解析 + 顺序表 vs 链表缓存机制对比(图解 CPU 层级)
c语言·链表·缓存
雨落在了我的手上18 小时前
C语言入门(二十一):字符函数和字符串函数(1)
c语言
embrace9918 小时前
【C语言学习】结构体详解
android·c语言·开发语言·数据结构·学习·算法·青少年编程