c语⾔基础——对⽂件的输⼊和输出(详细版)
⽂件是程序设计中⼀个重要的概念,所谓“⽂件”⼀般指存储在外部介质上数据的集合。
⽂件有不同的类型,在c程序设计中,主要⽤到两种⽂件程序⽂件,数据⽂件。
下⾯介绍⼀些有关⽂件的基本概念。
1.程序⽂件包括源程序⽂件(后缀为.c)、⽬标⽂件(后缀为.obj)、可执⾏⽂件(后缀为exe)等。这种⽂件的内容是程序代码
2.数据⽂件的内容不是程序,⽽是供程序运⾏时读写的数据。其根据数据的组织形式可分为⽂本⽂件和⼆进制⽂件
3.⽂件缓冲区:ANSI C标准采⽤“缓冲⽂件系统处理数据⽂件。系统⾃动地在内存区为程序中每⼀个正在使⽤的⽂件开辟⼀个⽂件缓冲区,在向⽂件输出数据时,它就作为输出缓冲区,数据“装满”缓冲区后⼀起送到磁盘。在从⽂件输⼊数据时,它就作为输⼊缓冲区,从磁盘读出⼀批数据,送到缓冲区,最后送到程序。
4.⽂本类型指针:每个被使⽤的⽂件都在内存中开辟⼀个相应的⽂件信息区,⽤来存放⽂件的有关信息。
这些信息是保存在⼀个结构体变量中的,该结构体类型是由系统声明的,取名为FILE。例如有**⼀种c编译环境提供的stdio.h头⽂件中有以下⽂件类型声明:
typedef struct
{
short level;                        //缓冲区“满”或“空”的程度
unsinged flags;                    //⽂件状态标志
char fd;          //⽂件描述符
unsigned char hold;                //如缓冲区⽆内容不读取字符
short bsize;          //缓冲区⼤⼩
unsigned char *buffer;        //数据缓冲区的位置
unsiged char *curp;          //⽂件位置标记指针当前的指向
unsigned istemp;        //临时⽂件指⽰器
short token;                  //⽤于有效性检查
}FILE;
通过⽂件指针变量能够到与它关联的⽂件,指向⽂件的指针变量指向内存中的⽂件信息区的开头
5.打开与关闭⽂件
所谓“打开”是指为⽂件建⽴相应的信息区和⽂件缓冲区。
ANSI C规定了⽤标准输⼊输出函数fopen来实现打开⽂件——fopen(⽂件名,使⽤⽂件⽅式)
fopen("a1","r");
fopen函数的返回值是指向a1⽂件的指针变量(即a1⽂件信息区的起始地址)。通常将fopen函数的返回值赋给⼀个指向⽂件的指针变量。如
FILE *fp;
fp=fopen("a1","r");
这样fp就和⽂件a1相联系了,或者说fp指向了⽂件。
使⽤⽂件的⽅式:
r:只读⽅式,⽂件必须存在
w:只写⽅式,若⽂件存在,则原有内容会被清除;若⽂件不存在,则会建⽴⽂件
a:追加⽅式打开只写⽂件,只允许进⾏写操作,若⽂件存在,则添加的内容放在⽂件末尾;若不存在,则建⽴⽂件
+:可读可写
b:以⼆进制⽅式打开⽂件
t:以⽂本⽅式打开⽂件(默认⽅式下以⽂本⽅式打开⽂件)
下⾯是常见的组合:
r: 以只读的⽅式打开⽂件,只允许读,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部
r+: 以可读可写的⽅式打开⽂件,允许读写,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部
rb+: 以可读可写、⼆进制⽅式打开⽂件,允许读写,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部rt+: 以可读可写、⽂本⽅式打开⽂件,允许读写,此⽂件必须存在,否则返回NULL,打开成功后返回⽂件指针,位置指针指向⽂件头部w: 以只写的⽅式打开⽂件,只允许写,若⽂件存在,⽂件中原有内容会被清除;若⽂件不存在,则创建⽂件,打开成功后返回⽂件指针,位置指针指向⽂件头部
w+: 以读写的⽅式打开⽂件,允许读写,若⽂件存在,⽂件中原有内容会被清除;若⽂件不存在,则创建⽂件,打开成功后返回⽂件指针,位置指针指向⽂件头部
a: 以追加、只写的⽅式打开⽂件,只允许写。若⽂件存在,则追加的内容添加在⽂件末尾,若⽂件不存在,则创建⽂件。打开成功后返回⽂件指针,位置指针指向⽂件头部(注意很多书上或资料上讲述追加⽅式打开成功后位置指针指向⽂件末尾是错误的)
a+: 以追加、可读写的⽅式打开⽂件,允许读写。若进⾏读操作,则从头开始读;若进⾏写操作,则将内容添加在末尾。若⽂件不存在,则创建⽂件。打开成功后返回⽂件指针,位置指针指向⽂件头部。
常⽤⽂件打开⽅式:
if((fp=fopen("file1","r"))==NULL)
{ printf("cannot open this file\n");
exit(0);
}
⽤fclose函数关闭数据⽂件
⽤法:fclose(⽂件指针),如
fclose(fp);
关闭⽂件的⽬的是防⽌结束程序时数据丢失。因为向⽂件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给⽂件,当数据未充满缓冲区时程序结束运⾏,有可能使缓冲区的数据丢失,⽤fclose函数关闭⽂件时,会先把缓冲区中的数据输出到磁盘⽂件,然后才撤销⽂件信息区。
fclose函数也带回⼀个值,当成功的执⾏了关闭操作,则返回为0,否则返回EOF(-1)。
6.顺序读写数据⽂件
对⽂本⽂件读⼊或输出⼀个字符的函数:
1.fgetc
调⽤形式:fgetc(fp),从fp指向的⽂件读⼊⼀个字符,读成功带回所读字符,失败则返回⽂件结束标志EOF
2.fputs
调⽤形式:fputc(ch,fp),把字符ch写到⽂件指针变量fp所指向的⽂件中,输出成功返回值就是输出的字符,输出失败则返回EOF。
在访问磁盘⽂件时,是逐个字符(字节)进⾏的,每访问完⼀个字节后,当前读写位置⾃动后移。为了知道对⽂件读写是否完成,即检测⽂件尾标志是否已被读取过(⽂件的所有有效字符后有⼀个⽂件尾标志,⽤标识符EOF表⽰)。⽤feof函数可检测⽂件尾标志是否被读取过,若已读过,返回值为1,否则为0。
对⽂本⽂件读⼊或输出⼀个字符串的函数:
3.fgets
调⽤形式:fgets(str,n,fp),即从fp指向的⽂件读⼊⼀个长度为(n-1)的字符串(最后加⼀个’\0’),存放到字符数组str中,返回值为地址str或NULL。
如果读完字符串之前遇到’\n’或EOF,读⼊结束,’\n’也作为⼀个字符读⼊。
c语言struct头文件4.fputs
调⽤形式:fputs(str,fp),即把str所指向的字符串写到⽂件指针变量fp所指向的⽂件中。输出成功,返回0,否则返回⾮0值。
7.⽤格式化的⽅式读写⽂本⽂件
对字符的输⼊输出前⾯已说明,怎么输⼊输出类型丰富的数据呢?
printf和scanf函数向终端进⾏格式化的输⼊输出。
fprintf和fscanf函数向⽂件进⾏格式化的输⼊输出。
1.⼀般调⽤⽅式
fprintf(⽂件指针,格式化字符串,输出表列)
fscanf(⽂件指针,格式化字符串,出⼊表列),如
fprintf(fp,"%d,%6.2f",i,f)
fscanf(fp,"%d,%f",&i,&f);
8.⽤⼆进制⽅式向⽂件读写⼀组数据
fread(buffer,size,count,fp); 从⽂件读⼊count个size⼤⼩的数据项,放在地址buffer中。
fwrite(buffer,size,count,fp); 把从地址buffer开始的存储区中的数据向⽂件输出。
在读写时以⼆进制形似进⾏的,向磁盘写数据时,直接将内存中⼀组数据原封不动、不加转换的复制到磁盘⽂件上。fread或fwrite函数的类型为int型,如果执⾏成功,则返回值为形参count的值,即输⼊或输出数据项的个数。9.关于⽂件位置标记的函数
–rewind函数使⽂件位置标记指向⽂件开头,⽆返回值。
rewind(fp)
–fseek(⽂件类型指针,位移量,起始点),如
fseek(fp,100L,0); 将⽂件位置标记向前移到离开头100个字节处
fseek(fp,50L,1); 将⽂件位置标记向前移到离当前位置50个字节处
fseek(fp,-10L,2); 将⽂件位置标记从末尾处向后退10个字节

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。