文件和文件操作详细解释

目录

目录

1、为什么使用文件?

2、什么是文件?

2.1程序文件

2.2数据文件

2.3文件名(文件标识)

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

4、文件的打开和关闭

4.1流

4.2标准流

4.3文件指针

4.4文件的打开和关闭

5、写文件和读文件

6、文件的顺序读写

6.1 fgetc和fputc

6.2 fgets和fputs

6.3 scanf ,fscanf, sscanf

6.4 printf, fprintf, sprintf

6.5 fread, fwrite

7、文件的随机读写

7.1  fseek

7.2 ftell

7.3 rewind

8、文件结束标志的判定

8.1 feof

8.2 ferror

8.3 如何判断

8.3.1 使用fgetc

8.3.2 使用fgets

8.4 使用fread

9、文件缓冲区


 

1、为什么使用文件?

 我们写的程序的数据是存储在电脑的内存中,当我们运行一个程序之后,如果退出程序,内存回收,上一次输入输出的数据内容不会保留。如果我们想要把我们的输入输出的数据内容永久保留,我们就要使用文件。

2、什么是文件?

硬盘(磁盘)中的文件就是文件。

文件按功能分为程序文件和数据文件。

2.1程序文件

程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程(windows 环境后缀为.exe)。

2.2数据文件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。
 

2.3文件名(文件标识)

文件名:⽂件路径+⽂件名主⼲+⽂件后缀
例如:E:\vscode\test_c

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

根据数据的组织形式, 数据⽂件被称为⽂本⽂件或者⼆进制⽂件。
数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是 ⼆进制⽂件
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是 文本文件
⼀个数据在⽂件中是怎么存储的呢?
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。
例如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽⼆进制形式输出,则在磁盘上只占4个字节。
用二进制编辑器打开,才能读取到二进制数据,如果用文本编辑器打开,看到的是乱码

记事本文件打开

4、文件的打开和关闭

4.1流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了⽅便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以通过流进行输入输出。
流相当于键盘,触控笔等和屏幕显示器之间的交流工具。
C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。
⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作。

4.2标准流

stdin:标准输入流,输入到屏幕上,scanf通过标准输入流输入数据到屏幕上

stdout:标准输出流,输出到屏幕上  printf通过标准输出流输出数据到屏幕上

stderr:标准错误流,大多数情况输出到屏幕显示器

scanf和printf默认打开了这三个流

这三个流的类型是FILEI* ,这个叫做文件指针

C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

4.3文件指针

文件指针的类型是FILE*,它指向文件所在的地址。
创建文件指针:  例如  FILE* pf = fopen("test.txt", "w");

4.4文件的打开和关闭

// 打开⽂件
FILE * fopen ( const char * filename, const char * mode );
// 关闭⽂件
int fclose ( FILE * stream );

5、写文件和读文件

FILE* pf = fopen("文件名","打开方式")

6、文件的顺序读写

6.1 fgetc和fputc

int fputc ( int character, FILE * stream );

int fgetc ( FILE * stream );

6.2 fgets和fputs

int fputs ( const char * str, FILE * stream );+——从把字符串写入到流中

char * fgets ( char * str, int num, FILE * stream );——从流中输入最多num-1个字符到字符数组中,最后一个位置默认放'\0'

6.3 scanf ,fscanf, sscanf

scanf   

int scanf ( const char * format, ... );

fscanf

int fscanf ( FILE * stream, const char * format, ... );----从流里面读取格式化数据,在读取的结尾添加'\0'

sscanf

int sscanf ( const char * s, const char * format, ...);----从字符串中读取数据,并格式化输入(如果是字符串,在最后自动添加'\0')

6.4 printf, fprintf, sprintf

printf 默认是标准输出流

fprintf

int fprintf ( FILE * stream, const char * format, ... );把格式化的数据写到流中

sprintf

int sprintf ( char * str, const char * format, ... );---把格式化的数据写入到字符串中

6.5 fread, fwrite

fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );-----从流中读取count*size个byte的数据,并写入到ptr指针中,如果未读取到count*size个BYTE的数据,则读取结束。

fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

----把count*size个byte的数据写入到流中

7、文件的随机读写

7.1  fseek

int fseek ( FILE * stream, long int offset, int origin );----根据⽂件指针的位置和偏移量来定位⽂件指针。

返回值:

如果成功,返回0,如果失败,返回非0值

7.2 ftell

long int ftell ( FILE * stream );
功能:
返回⽂件指针相对于起始位置的偏移量

7.3 rewind

void rewind ( FILE * stream );
功能:
让⽂件指针的位置回到⽂件的起始位置

8、文件结束标志的判定

8.1 feof

int feof ( FILE * stream );

判断文件读取结束的原因是否为读取到了文件末尾,如果读取到了文件末尾,返回非0值,否则,返回0。

8.2 ferror

int ferror ( FILE * stream );

判断文件读取结束的原因是否为读取过程中发生了错误,如果读取过程发生了错误,返回非0值,否则,返回0。

8.3 如何判断

1. ⽂本⽂件读取是否结束,判断返回值是否为 EOF (-1) fgetc ),或者 NULL (0) fgets
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. ⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

8.3.1 使用fgetc

8.3.2 使用fgets

读取到了文件结尾
读取发生错误

8.4 使用fread

9、文件缓冲区

ANSIC 标准采⽤“缓冲⽂件系统” 处理的数据⽂件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中缓
冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的⼤⼩根据C编译系统决定的。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值