专题十二 文件

12.1文件的基础知识

12.1.1二进制文件与文本文件

C语言把文件看作一个字符(或字节)的序列,即由一个一个字符(字节)的数据顺序组成。根据组织形式数据可分为两种类型,文本文件(也称 ASCII 文件)和二进制文件。
两者的区别:(1)文本文件中,数据以ASCII码形式存放,即每个 ASCII码代表1个字符,输出与字符一一对应,一个字节代表一个字符,因此便于对字符逐个进行处理。但占用存储空间大,且要花时间进行二进制与ASCII码的转换。
(2)在二进制文件中,一个字节不对应一个字符,因此不能直接对字符逐个处理,但这种二进制文件可以节省外存空间和转换时间,存放数据的效率很高,所以当使用含有大量数值的文件时可以考虑使用二进制文件。
(3)文本文件有单独的文本行,在写入文件时,会自动生成行结束标记:二进制文件不被分成单
独的行,没有行结束标志。
如 short int a=123:
短整型变量 a 在内存中占2个字节,在二进制文件中,变量a同样占2个字节。但在文本文件中,a需要3个字节的存储空间。而如果 a 的值变为 1234,对二进制文件来说,变量a的值仍占 2 个字节,而在文本文件中则占4个字节

12.2文件的打开与关闭

12.2.1文件结构体及文件类型指针

stdio.h中定义了一个结构类型FILE。其中包括诸如缓存区的位置,文件的状态,是否正在读取或写入,文件的当前位置及是否发生错误等有关的文件的信息。这种结构体有系统而不是程序员处理
对于每个要操作的文件,用户首先要定义一个指向FILE类型的指针变量。如 FILE *fp

12.2.2文件的打开

在使用文件前必须打开文件。打开文件就是建立文件指针变量与为外部文件的联系,即建立流的通道。格式:FILE *fp;
fp=fopen(filename,mode);//filename 中表明路径的斜线必须使用双斜线; 如 “c:\one\file.c"
filename表示文件名,即要使用的文件名;mode指定了对文件的操作类型,即对文件的处理方式。若成功,则在内存中开辟一个存储空间存放 FILE类型数据并返回其起始地址,否则返回 NULL。
mode: 处理方式 指定文件不存在 指定文件存在 含义
1.r:只读 出错 正常打开 以读方式打开一个文本文件
2.w:只写 建立新文件 文件原有内容丢失 以写方式打开一个文本文件
3.a:追加 建立新文件 在文件原有内容后追加 以追加方式打开一个文本文件
4.rb:只读 出错 正常打开 以读方式打开一个二进制文件
5.wb:只写 建立新文件 文件原有内容丢失 以写方式打开一个二进制文件
6.ab:追加 建立新文件 在文件原有内容后追加 以追加方式打开一个二进制文件
7.r+:读写 出错 正常打开 以读或写方式打开一个文本文件
8.w+:读写 建立新文件 文件原有内容丢失 以读或写方式打开一个文本文件
9.a+:读写 建立新文件 在文件原有内容后追加 以读或写方式打开一个文本文件
10.rb+:读写 出错 正常打开 以读或写方式打开一个二进制文件
11.wb+:读写 建立新文件 文件原有内容丢失 以读或写方式打开一个二进制文件
12.ab+:读写 建立新文件 在文件原有内容后追加 以读或写方式打开一个二进制文件

1.在程序运行时,系统自动打开3个标准文件(标准流):stdin,stdout和stderr,当程序需要从标准输入流(stdin)进行输入时,它从键盘获得输入,当程序向标准输出流(stdout)输出数据时,就把数据发送给终端屏幕;由库函数生成的出错信息送到标准出错流 (stderr),即系统终端屏幕。
2.当以读的方式打开的文件不存在时,会产生错误;也有可能文件存在,但没有使用权限,也会产生错误,fopen9)函数将返回 NULL。
在具体程序中,通常用下面的方式检查文件 file 是否正常打开,并显示相应的信息:

if((fp=fopen("file.c”,"r")==NULL)
{
printf("文件打开失败,退出程序的执行\n");
exit(0);//其中,exit()函数能关闭所有文件,终止程序
}
12.2.3文件的关闭

关闭文件就是断开文件指针变最与外部文件之间的联系,即关闭流
格式:fclose(fp);
1,执行该函数时,首先释放文件缓冲区,同时保证文件的完整性。若成功地关闭了指定的文件,函数返回0值,否则返回EOF(定义在 stdio.h中)
2.由于文件是通过缓冲区进行读写的,所以当读写文件时,访问的是文件缓冲区,而不是直接访问文件,如果没有清除和储存缓冲区中的内容就终止程序,存放在缓冲区的数据就会丢失,而且大多数操作系统对于同时打开的文件数目是有限制的,因此,一旦不使用某文件,就一定要用 fclose()函数关团它。

12.3文件的输入与输出操作

12.3.1读写文件中的字符

1.字符读写函数
(1)函数fgetc()用于从1个以只读或读写方式打开的文件读出字符。其函数原型为:
int fgetc(FILEfp);
其中,fp是由函数 fopen()返回的文件指针,函数功能是从fp所指文件中读1个字符,并将文件位置指针指向下1个字符。若读取成功,则返回该字符;若读到文件末尾,则返回 EOF、通常使用方法如下.ch=fgetc(fp);表示从fp 所指文件中读1个字符,然后将其赋值给字符变量 ch。
(2)函数fputc()用于将1个字符写到fp所指的文件中。其函数原型为:int fputc(int c,FILE
fp);
函数的功能是将变量c写到fp所指文件中。若写入成功,则返回该字符;若写入错误,则返回EOF。使用方法:putc(ch,p);
例 while((ch=getchar())!=‘\n’)
fputc(ch,fp);
2读写文件中的字符串
(1)从文件中读取字符串
函数原型:char*fgets(char *str,int n,FILE fp);其中,str 是要读取的字符串,函数的功能是从 fp所指的文件中读n-1个字符,存放到fp所指的存放单元中。当读到回车换行符、文件末尾或读满 1 个字符,函数返回该字符的首地址,函数返回值为指向所读串的指针,若出错或已到文件尾就返回1个空指针。
如:fgets(str,n,p);fgets ()函数执行结束时,文件指针会偏移至当前读完的字符之后的位置。
(2)向文件写入字符串
函数原型:char
fputs(const char str,FILEfp);
函数功能是将 str 中的字符串写入中所指文件中,若写入错误,则返回EOF。 如:fputs(str,fp);

12.3.2批量读写二进制文件数据

l. fread()函数
函数原型:unsigned fread(void buffer,size-t size,size-t count,FILEfp);
其中,buffer是待读入数据块的起始地址;size是每个数据块的大小;count表示最多允许读取的数据块个数。
函数功能:从fp所指文件中读取数据块并储存到buffer指向的内存中。函数返回的是实际读到的数据块的个数。
2.fwrite()函数
函数原型: unsigned fwrite(const void buffer;size-t size,size-t count,FILEfp)
buffer是待输出数据块的起始地址;size表示每个数据块的大小 (待输出的每个数据块的字节数);count表示最多允许写入的数据块个数(每个数据块size个字节)。
函数功能:将buffer指向的内存中的数据块写入fp所指的文件。
fread和fwrite实现对文件批量数据的读写
创建文件
FILEfp;fp=fopen(“data”,“wb”);fwrite(student,SIZE,k,fp);
fclose(fp);
读取文件
FILE
fp;fp=fopen(“data”“rb”),fread(student,SIZE,k,fp);fclose(fp);

12.3.3格式化输入输出文件中的数据

1.fscanf()函数用于按指定格式从文件中读取文件
函数原型:int fscanf(FILEp,格式控制字符串,输出项列表);如 scan(fp,“%d”,&x);函数表示从 所指文件中,按 int 型格式读入数据,存放在整型变量x中
2.fprintf()函数用于按指定格式向文件中写数据
函数原型:int fprintf(FILE
fp,格式控制子串,输出项列表):
如 fprintf(fp,”%d",x);函数表示按 int格式将变量的值写入fp所指的文件中。
fscanf()函数和 printf()函数的执行很像 scanf()和 printf(),不同之处在于读入和写出的数据都面向指定的文件,而不像 scanf()和 printf()那样面向stdin和stdout。

12.4函数返回值的总结

12.4.1文件的打开与关闭函数

fopen()函数: 若打开成功,返回起始地址,否则返回 NULL(定义在头文件 stdio.h 中)。fclose()函数: 若成功关闭指定文件,则函数返回0值,否则返回EOF(定义在头文件 stdio.h)

12.4.2文件的输入与输出函数

fgetc()函数: 若读取成功,则返回该字符,若读到文件末尾,则返回 EOF.
fputc()函数:若写入成功,则返回该字符;若读到文件末尾,则返回 EOF。
fgets()函数:着读取成功,则函数返回指向所读串的指针,即返回该字符串的首地址:若出错或己到文件尾,就返回一个空指针NULL。
fputs()函数:若写入错误,则返回 EOF。
fread()函数:函数返回的是实际读到的数据块个数
fwrite()函数:函数返回的是实际写入的数据块个数

12.4.3文件的随机访问

l.rewind()函数:函数无返回值
调用形式:rewind(fp);
功能:将文件位置指针复位到文件的首部。
2.ftell()函数函数返回 fp所指文件的文件位置指针当前所指位置(字节数),若出错返回-1
调用形式:long loc;loc=ftell(fp);
功能:求出当前文件的处理位置。
3.fseek()函数:调用形式:fseek(fp,offsct,whence);
功能:将fp的文件指针从 whence开始,移动offset 个字节,指向下1个要读取的数据的位置。

12.4.4文件检测函数

feof(文件指针)函数:若文件结束,则返回值为 1(真),否则为0(假).
功能:检测是否到文件尾,它既适用于文本文件,又适用于二进制文件

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值