【C语言13】文件

目录

一、什么是文件

1、概念

2、分类

二、文件的打开和关闭

1、文件指针

2、打开文件

3、关闭文件

4、顺序读写

1.补充

2.函数

3.区分

5、随机读写

1.fseek函数

2.ftell函数

3.rewind函数

三、文本文件和二进制文件

1、一个数据在内存中是怎么存储的呢?

四、文件读取结束的判定

1、注意

2、文本文件

3、二进制文件

五、文件缓冲区


一、什么是文件

1、概念

磁盘上的文件是文件。

2、分类

1.程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境 后缀为.exe)。

2.数据文件

文件的内容不一定是程序,而是程序运行时读写的数据。

3.文件名

举例:

c:\code\test.txt


二、文件的打开和关闭

1、文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE

该结构体变量中的内容是自动填充的,使用者不用关心细节。

创建一个文件指针变量:

FILE* pf;

通过文件指针变量能够找到与它关联的文件。


2、打开文件

命令:fopen

文件打开失败会返回一个空指针。


3、关闭文件

命令:fclose

如果打开文件之后不关闭,之后能打开文件的数量用完之后,就不能再打开文件了。


4、顺序读写

1.补充

流:

C语言程序,只要运行起来,就默认打开了3个流:

stdin - 标准输入流 - 键盘

stdout- 标准输出流 - 屏幕

stderr- 标准错误流 - 屏幕

2.函数

FILE* pf = fopen("test.bat","w");或者FILE* pf = fopen("test.bat","r");

都可以直接使用stdin或者stdout。

fgetc

int ret = fgetc(fp);或者int ret = fgetc(stdin);

fputc

int ret = fputc("a",fp);或者int ret = fputc("a",stdout);

fgets

fgets("abcd",4,fp); --- 4是指读取的个数,包含\0

fputs

fputs("abcd",fp); --- 如果需要换行,需要加上\n

fscanf

fscanf(fp,"%s %d %f,s.arr,&(s.num);

fprintf

以上形式都是以文本的形式进行操作。

fread

int ret = fread(&s,sizeof(struct S),1,pf);

fwrite

fwrite(&s,sizeof(struct S),1,pf); --- &s是指要写的那个地址;sizeof是指数据的大小,单位是字节;1是指数据个数;pf是指文件流。

以上形式是以二进制来读写。

3.区分

scanf --- 针对标准输入的格式化的输入语句 - stdin

fscanf --- 针对所有输入流的格式化的输入语句

sscanf --- 从一个字符串中读取一个格式化的数据

printf --- 针对标准输出的格式化输出语句 - stdout

fprintf --- 针对所有输出流的格式化输出语句 - stdiout/文件

sprintf --- 把一个格式化的数据转换成字符串


5、随机读写

1.fseek函数

fseek(pf,2,SEEK_CUR); ----- 2是指偏移量;SEEK_CUR是指指针当前位置

SEEK_END是指文件末尾;SEEK_SET是指文件开始。

2.ftell函数

返回文件指针相相对于起始位置的偏移量。

int ret = ftell(pf);

3.rewind函数

让文件指针的位置回到文件的起始位置。

int ret = rewind(pf);


三、文本文件和二进制文件

1、一个数据在内存中是怎么存储的呢?

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而 二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。


四、文件读取结束的判定

1、注意

牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。

而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。(找原因)

2、文本文件

判断返回值是否为EOF(fgetc),或者NULL(fgets)。

fgetc函数在读取结束的时候,会返回EOF;正常读取的时候,返回的是读取到的字符的ASCII码值。

fgets函数在读取结束的时候,会返回NULL;正常读取的时候,返回存放字符串的空间起始地址。

3、二进制文件

判断返回值是否小于实际要读的个数(fread)。

fread函数在读取的时候,返回的是实际到的完整元素的个数;

如果发现读取到的完整元素的个数小于,指定的元素个数,这就是最后一次读取。

五、文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序 中每一个正在使用的文件开辟一块“文件缓冲区”。

从内存向磁盘输出数据会先送到内存中的缓冲区,装 满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓 冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。

缓冲区的大小根 据C编译系统决定的。

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。 如果不做,可能导致读写文件的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值