C语言 文件操作


前言

本篇用来记录学习,分享经验,有错误请多指正!


一、文件是什么?

磁盘里的东西都是文件
分为程序文件、数据文件

1.程序文件

程序文件包括源程序文件(.c)、目标文件(.obj)、可执行程序(.exe

2.数据文件

读写数据用的文件,例如文本文件(.txt


二、流和标准流

1.流

为了方便我们操作不同的外部设备进行输入输出和各种操作,抽象出来的一个概念,可以把流想象成一条流淌字符的河

2.标准流

C语言启动时默认打开3个标准流:
stdin - 标准输入流,一般情况下,键盘输入(scanf就是从标准输入流读取数据
stdout - 标准输出流,一般情况下,屏幕输出(printf就是将数据输出到标准输出流
stderr - 标准错误流,输出错误信息到屏幕
stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为⽂件指针。
C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的。

3.文件指针

指向文件首地址的指针(FILE*)
例如:

FILE* fp;
//定义了一个指针fp,这个指针指向一个文件

三、文件的打开和关闭

1.文件打开模式

文件使用方法含义如果指定文件不存在
r 只读为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
w 只写为了输出数据,打开⼀个⽂本⽂件建⽴⼀个新⽂件
a 追加向⽂本⽂件尾添加数据建立一个新文件
文件使用方法含义如果指定文件不存在
+ 读写为了读写打开一个文本文件和其他方法组合使用
b 二进制打开一个二进制文件和其他方法组合使用

例:

文件使用方法含义如果指定文件不存在
rb为了输入数据,打开一个二进制文件出错
ab+打开一个二进制文件,在末尾读写数据建立一个新文件

2.打开和关闭

读写前应该先打开文件,用完再关闭
ANSIC 规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

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

直接写文件名默认实在当前目录下寻找,如果需要指定目录,写路径时需要用 \\ 双斜杠
例如:

FILE* fp = fopen("c:\\User\\test.txt","w");

三、文件的读写

1.顺序读写

函数名格式代码解释功能
fgetcchar c = fgetc(fp);从fp指向的文件中读取一个字符放到字符变量c里,如有循环,从前往后读取,每读取一次,光标向后移一位从指定的文件读取一个字符
fputcfputc(“A”,fp);把字符A存到fp指向的文件里,他会从前往后存(顺序写入),并且覆盖原有数据写入一个字符到指定的文件
fgetsfgets(str,n,fp);从fp指向文件读取长度为n-1(给\0留一位)的字符串,存入str数组从指定的文件读取一个字符串
fputsfputs(str,fp);把fp指向的文件中所有字符全部存入str数组把指定文件所有字符存入指定数组
fscanffscanf(fp,“%d,%s,%f”,&age,&name,&score);从输入流中读取数据,并用对应的格式写入到fp指向的文件里用指定格式输入,于scanf函数大致相同
fprintffprintf(fp,“%d ,%s ,%f \n”);从fp指向的文件中对应的信息用指定格式输出到屏幕上用指定格式输出,于printf函数大致相同
freadfread(&Test,sizeof(Test),1,fp);从fp指向的文件中读取1个sizeof(Test)大小的数据(一条信息),存放在Test结构体中从指定的文件读取指定大小数量的数据写入到指定结构体
fwritefwrite(&Test,sizeof(Test),1,fp);从结构体Test中读取1个sizeof(Test)大小的数据(一条信息),存放在fp指向的文件里从指定的结构体读取指定大小数量的数据写入到指定的文件

2.随机读写

2.1.fseek(根据⽂件指针的位置和偏移量来定位⽂件指针)

SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾

fseek(pf,2,SEEK_SET);
/*
pf->test.txt
test.txt内容:Hello
偏移前光标位置
->H ello
偏移后光标位置
He ->llo
*/

定位到pf指向的文件的 开头 偏移2字节 的位置

2.2.ftell(返回⽂件指针相对于起始位置的偏移量)

ftell(fp);

如果现在fp指向的文件里写的是“Hello”
现在光标位置在He ->llo(在第一个 l 这里)
ftell返回的值是从开头H到现在光标中间的差值,也就是2字节
如果定位到SEEK_END(文件末尾)的话”\0“也算一字节

2.3.rewind(让⽂件指针的位置回到⽂件的起始位置)

和字面意思一样,把光标(文件指针)回退到起始位置(最开头)

跟上面一样,现在光标指向He ->llo(第一个 l )

rewind(fp);

光标就回到了 ->Hello(H前面)


总结

简单写了点文件操作,有啥错误务必指正一下!!
希望能给大家带来点有用的东西(擦汗请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值