C语言文件操作

1.文件的概念

磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)
程序文件:
包括源程序文件(后缀为 .c , 目标文件( windows 环境后缀为 .obj , 可执行程序( windows 环境
后缀为 .exe )。
数据文件:
文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,
或者输出内容的文件。
文件名:
一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含 3 部分:文件路径 +文件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为 文件名

2.文件的打开与关闭

2.1.文件指针

定义:

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

工作原理

1.文件指针是文件操作的核心,所有文件读写函数都通过它定位文件位置并执行操作。

2.文件指针在文件打开时由 fopen() 函数返回,在文件关闭时失效。

2.2.文件的打开与关闭

1.打开文件(fopen)
参数

filename:文件路径(相对或绝对)。

mode:打开模式(详见下表)。

返回值:
成功:返回文件指针
失败:返回 NULL,需处理错误。

文件打开模式:
主要的还是下面三个
文件打开的一般示例:
2.关闭文件(fclose)
参数
文件指针
返回值:
成功:返回 0
失败:返回 EOF
文件关闭一般示例:

完整示例:

3.文件的写入和读取

3.1.字符的输入输出函数

1.fgetc(字符输入)

1.函数原型int fgetc(FILE *stream);

功能:从输入流中读取单个字符。

参数stream 为文件指针(如 stdin 或已打开的文件)。

返回值:

成功:返回读取的字符,转换成对应的ascll

失败或读到文件末尾:返回 EOF

示例

2. fputc(字符输出)

函数原型int fputc(int char, FILE *stream);

功能:向输出流写入单个字符。

参数:

char:写入的字符

stream:文件指针

返回值:

成功:返回写入的字符

失败:返回EOF

示例

3.2.文本行的输入输出函数

1.fgets(文本行输入)

函数原型char *fgets(char *str, int n, FILE *stream);

功能:从输入流读取一行文本(包括换行符 \n),最多读取 n-1 个字符(其中要剩下一个位置,储存\0)

参数:

str:接受读取的文本行指针

n:一次性读取的个数

stream:读取的文件指针

返回值:

成功:返回 str

失败或读取的文件末尾:返回NULL

注意:

1.自动会再字符串末尾加上\0

2.行长度超过 n-1,剩余字符会留在流中下次读取

示例:

2. fputs(文本行输出)

函数原型int fputs(const char *str, FILE *stream);

功能:向输出流写入字符串(不自动添加换行符)。

参数:

str:字符串指针

stream:文件指针

返回值:

成功:返回非负数

失败:返回EOF

示例

3.3.格式化输入输出函数

1.fscanf(格式化输入)

函数原型int fscanf(FILE *stream, const char *format, ...);

功能:从输入流按格式读取数据。

参数:

format:格式字符串(如 "%d %s")。

可变参数:存储读取结果的变量地址。

返回值:

成功:返回成功匹配的参数数量。

失败或文件末尾:返回 EOF

示例

2. fprintf(格式化输出)

函数原型int fprintf(FILE *stream, const char *format, ...);

功能:向输出流按格式写入数据。

参数:

format:格式字符串(如 "Value: %d\n")。

可变参数:要写入的数据。

返回值:

成功:返回写入的字符数。

失败:返回负数

示例:

3.4.二进制输入输出

 1.fread(二进制输入)

函数原型size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:从文件流读取二进制数据块。

参数:

ptr:存储数据的缓冲区指针。

size:每个数据项的字节大小。

nmemb:要读取的数据项数量。

stream:文件指针(需以二进制模式打开,如 "rb")。

返回值:返回实际读取的数据项数量(可能小于 nmemb)。

示例

2.fwrite(二进制输出)

函数原型size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:向文件流写入二进制数据块。

参数:

ptr:要写入的数据指针。

size:每个数据项的字节大小。

nmemb:要写入的数据项数量。

返回值:返回实际写入的数据项数量。

示例

3.5.函数比较

1. 输入函数对比:scanf vs fscanf vs sscanf

共同点

1.均使用格式字符串指定输入类型(如 %d%s%f 等)。

2.返回值均为成功匹配的参数数量,失败或文件末尾返回 EOF

核心区别

1.输入源不同scanf 从键盘读取,fscanf 从文件读取,sscanf 从字符串读取。

场景:

scanf:交互式输入(如用户输入)

fscanf:文件数据解析(如配置文件)

sscanf:字符串解析(如解析网络协议或文本数据)

代码示例:

2. 输出函数对比:printf vs fprintf vs sprintf

共同点

1.均使用格式字符串指定输出格式。

2.返回值均为写入的字符数(不包括结尾的 \0),错误时返回负数。

核心区别

2.输出目标不同printf 输出到屏幕,fprintf 输出到文件,sprintf 输出到字符串。

场景:

scanf:交互式输入(如用户输入)

fscanf:文件数据解析(如配置文件)

sscanf:字符串解析(如解析网络协议或文本数据

代码示例:

4.文件的随机读写

1.fseek
功能:移动文件位置指针到指定位置,支持从文件头、当前位置或文件尾开始偏移。
函数:
参数:
示例:
2.ftell
功能:返回文件位置指针相对于文件开头的偏移量(字节数)。
函数:
返回值:
成功:返回偏移量
失败:-1
示例:
3.rewind
功能:将文件位置指针移动到文件开头,清除错误标志
函数:
示例:
等价于:

5.frof的使用

功能:feof(FILE *stream) 用于检测文件指针是否已到达文件末尾

返回值:

到达文件末尾返回非0值(true)

未到达文件末尾返回0(false)

错误的使用场景:

此时可能会导致多执行一次循环

正确的方式:
feof和ferror的使用时机都是当文件的读取完成后使用的,判断是否是正常的结束

6.文件缓冲区

ANSIC 标准采用 缓冲文件系统 处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序
中每一个正在使用的文件开辟一块 文件缓冲区 。从内存向磁盘输出数据会先送到内存中的缓冲区,装
满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根
C 编译系统决定的。
主要功能就是:提高效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值