文件的使用详解

简介: 👩‍💻博客主页:[风起 风落](https://blog.csdn.net/qq_62939852?spm=1001.2101.3001.5343)的博客主页✨欢迎关注🖱点赞🎀收藏⭐留言✒👕参考网站:牛客网💻首发时间:🎞2022年7月30日🎠🎨你的收入跟你的不可替代成正比🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦💬给大家介绍一个求职刷题收割offer的地方👉[点击网站](https://www.nowcoder.com/link/pc_csdncpt_fqfl_c)

👩‍💻博客主页:风起 风落的博客主页

✨欢迎关注🖱点赞🎀收藏⭐留言✒

👕参考网站:牛客网

💻首发时间:🎞2022年7月30日🎠

🎨你的收入跟你的不可替代成正比

🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦

💬给大家介绍一个求职刷题收割offer的地方👉点击网站

@TOC

一、文件的分类

从文件的功能考虑分为 程序文件和 数据文件

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

数据文件为程序运行时读写的数据

二、文件的打开和关闭

1.文件指针

有一个文件, 与其绑定一个文件信息区,该文件信息区可以看作是一个结构体的变量

用typedef后  重命名为FILE

2.文件打开

在这里插入图片描述

用 fopen打开这个文件,主动创建文件信息区,将文件信息区的地址传递过来

filename 为文件名  mode为文件的打开方式

fopen文件打开失败会返回NULL

### (1).文件打开方式

"w"为打开文件  如果不存在这个文件 使用"w"就会自动创建一个空文件

每次使用"w" , 如果文件中存在内容 就会被销毁

"r" 读文件  如果找不到文件 就会报错

2.文件关闭

  在这里插入图片描述stream代表流
#include<stdio.h>
int main()
{
 FILE*pf=fopen("text.txt","w");//打开文件
 if(pf==NULL)//文件打开失败就报错
 {
 perror("fopen");
 return 1;
 }
 fclose(pf);//关闭文件
 pf=NULL;
 return 0;
 }

三、文件的顺序读写

注意事项

在文件中的输入输出跟以往的不太相同

输入——代表的是从文件中输入到内存中 即读取

输出——代表的是从内存到文件中输出    即写入

  在这里插入图片描述流的概念一个高度抽象的概念正常来说 程序是需要多个转换方式到各个外部设备中 而流则作为一个转换中介的功能通过程序往流中输入数据,在通过流找到外部设备的读写方式

1.字符输出函数——fputc

  在这里插入图片描述写文件c为 字符 而返回值int代表ASCII值stream代表流将字符传递到流中
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
 FILE*pf=fopen("text.txt","w");//打开text.txt文件 以写的方式
 if(pf==NULL)//判断文件是否打开失败
 {
 perror("fopen");
 return 1;
 }
 fputc('a',pf);//将字符传递到流中
 foutc('b',pf);
 fputc('c',pf);
 fclose(pf);//关闭文件
 pf=NULL;
 return 0;
 }

2.字符输入函数——fgetc

在这里插入图片描述

读文件

sream代表流

读一个文件在一个流中

如果读取正常返回字符的ASCII值

如果读取失败返回    或者文件结束返回EOF

关于返回类型为int的原因:>

EOF为文件结束标志 值为-1

字符的ASCII值可以当作整形计算

即 返回类型为int

#define _CRT_SECURE_NO_WARNINGS//在VS中关闭文件所要求的
#include<stdio.h>
int main()
{
 FILE*pf=fopen("test.txt","r");//从文件test.txt中读
 if(pf==NULL)//假设test.txt里面为abcd
 {
 perror("fopen");
 return 1;
 }
 int ret=fgetc(pf);
 printf("%c\n",ret);//a
  ret=fgetc(pf);
 printf("%c\n",ret);//b
  ret=fgetc(pf);
 printf("%c\n",ret);//c
 fclose(pf);
 pf=NULL;
 return 0;
}

3.文本行输出函数——fputs

在这里插入图片描述

写文件

string代表字符串

sream代表流

用一行写入文件中

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
FILE*pf=fopen("text.txt","w");
if(pf==NULL)
{
perror("fopen");
return 1;
}
fputs("abcdef\n",pf);
fputs("qwerty\n",pf);
fclose(pf);
pf=NULL;
return 0;
}

4.文本行输入函数——fgets

在这里插入图片描述

读一个字符串在流中

string 代表字符串

stream代表流

n代表最多读取的字符个数

因为读取出来的是字符串 要加\0 故 n-1为实际读取的字符数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
FILE*pf=fopen("text.txt","r");//假设文件中为abcdefg
if(pf==NULL)
{
perror("fopen");
return 1;
}
char arr[40={0};
fgets(arr,4,pf);
printf("%s\n",arr);//a b c
fgets(arr,4,pf);
printf("%s\n",arr);// d e f
 fclose(pf);
pf=NULL;
return 0;
}

5.格式化输出函数——fprintf

在这里插入图片描述

对格式化的数据 写文件

stream代表流

format代表格式(%s %d)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
 char name[20];
 int age;
 char sex[20];
}
int main()
{
struct S s={"张三",18,"男");
FILE*pf=fopen("test.txt","w");
if(pf==NULL)
{
perror("fopen");
return 1;
}
fprintf(pf,"%s %d %s",s.name,s.age,s.sex);
fclose(pf);
pf=NULL;
return 0;
}

6.格式化输入函数——fscanf

在这里插入图片描述

stream代表流

format代表格式

从文件中读取一个格式化的数据

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
 char name[20];
 int age;
 char sex[20];
}
int main()
{
struct S s={"张三",18,"男");
FILE*pf=fopen("test.txt","r");
if(pf==NULL)
{
perror("fopen");
return 1;
}
fscanf(pf,"%s %d %s",s.name,&(s.age),s.sex);//读文件
printf("%s %d %s\n",s.name,s.age,s.sex);//打印
fclose(pf);
pf=NULL;
return 0;
}

7.二进制输出函数———fwrite

在这里插入图片描述

按二进制的方式写文件

buffer 指向被写的数据

size 为字节数

count为最多写多少个元素

stream代表流

将数据的地址,字节数,元素个数 传入流中

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
 char name[20];
 int age;
 char sex[20];
}
int main()
{
struct S s={"张三",18,"男");
FILE*pf=fopen("test.txt","w");
if(pf==NULL)
{
perror("fopen");
return 1;
}
fwirte(&s,sizeof(struct S),1,pf);
fclose(pf);
pf=NULL;
return 0;
}

## 7.二进制输入函数———fread

在这里插入图片描述

以二进制的方式读文件

从流中读取 数据的地址 字节数 元素个数

返回值为实际完整读取的个数

想要结束读取时 看实际读取的完整个数是否小于元素个数 为即将停止的临界

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct S
{
 char name[20];
 int age;
 char sex[20];
}
int main()
{
struct S s={"张三",18,"男");
FILE*pf=fopen("test.txt","r");//读文件
if(pf==NULL)
{
perror("fopen");
return 1;
}
fread(&s,sizeof(struct S),1,pf);
printf("%s" "%d" "%s",s.name,s.age,s.sex);打印
fclose(pf);
pf=NULL;
return 0;
}

三、文件的随机读写

1.fseek

在这里插入图片描述

fseek来判断文件指针的位置和偏移量来定位文件指针

移动文件指针到特定位置

stream代表流

offset代表偏移量

origin代表起始位置

关于起始位置的三种状态:

SEEK_CUR表示从当前文件指针的位置开始偏移

SEEK_END表示从文件末尾开始偏移

SEEK_SET表示从文件的起始位置开始偏移

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
 FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读
 if(pf==NULL)//假设文件中为abcdef
 {
 perror("fopen");
 return 1;
 }
 int ret=fgetc(pf);
 printf("%c\n",ret);//a
 fseek(pf,-2,SEEK_END);
 ret=fgetc(pf);
 printf("%c\n",ret);//e
  ret=fgetc(pf);
 printf("%c\n",ret);//f
 fclose(pf);
 pf=NULL;
 return 0;
 }

在这里插入图片描述

这里要注意使用SEEK_END是从最后一个字符的后一个位置开始

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
 FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读
 if(pf==NULL)//假设文件中为abcdef
 {
 perror("fopen");
 return 1;
 }
 int ret=fgetc(pf);
 printf("%c\n",ret);//a
 fseek(pf,2,SEEK_SET);
 ret=fgetc(pf);
 printf("%c\n",ret);//c
  ret=fgetc(pf);
 printf("%c\n",ret);//d
 fclose(pff);
 pf=NULL;
 return 0;
 }

在这里插入图片描述

SEEK_SET从第一个字符开始

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
 FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读
 if(pf==NULL)//假设文件中为abcdef
 {
 perror("fopen");
 return 1;
 }
 int ret=fgetc(pf);
 printf("%c\n",ret);//a
 fseek(pf,2,SEEK_CUR);//来到这里时已经指向b的流 所以从b开始向后2个
 ret=fgetc(pf);
 printf("%c\n",ret);//d
  ret=fgetc(pf);
 printf("%c\n",ret);//e
 fclose(pf);
 pf=NULL;
 return 0;
 }

2.ftell

在这里插入图片描述

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

stream代表流

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
 FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读
 if(pf==NULL)//假设文件中为abcdef
 {
 perror("fopen");
 return 1;
 }
 int ret=fgetc(pf);
 printf("%c\n",ret);//a
 fseek(pf,-1,SEEK_END);
 ret=fgetc(pf);//f
 printf("%c\n",ret);//相对于起始位置的偏移量为5
 fclose(pf);
 pf=NULL;
 return 0;
 }

3.rewind

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
 FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读
 if(pf==NULL)//假设文件中为abcdef
 {
 perror("fopen");
 return 1;
 }
 int ret=fgetc(pf);
 printf("%c\n",ret);//a
 fseek(pf,-1,SEEK_END);
 rewind(pf);//文件指针回到起始位置
 ret=fgetc(pf);
 printf("%c\n",ret);//a
 fclose(pf);
 pf=NULL;
 return 0;
 }

四.文件读取的判定

  1. feof函数为判断报错是 正常遇到文件尾结束   还是读取失败报错
    (不使用于 判断是否报错的函数)
  2. fgetc函数  从流中读取字符  读取结束时 返回EOF
    正常情况下返回字符的ASCII值
  3. fgets函数 从流中读取字符串  读取结束时 返回NULL
    正常 情况下 返回 字符串的起始地址
  4. fread函数 二进制写文件  返回实际读取的完整元素的个数
    结束的临界条件为:实际读取的完整元素的个数<指定元素个数
目录
相关文章
|
2月前
|
存储 Java 程序员
文件的介绍
文件的介绍
27 1
|
2月前
|
存储 Python 内存技术
什么是文件?
什么是文件?
19 0
|
2月前
|
Windows
HiBit Uninstaller v3.2.10单文件版
HiBit Uninstaller是一款免费无广告功能强大的软件卸载程序,有强制卸载、批量卸载程序、Windows应用商店Appx管理器、Windows更新补丁管理器、浏览器扩展管理器、注册表清理、磁盘垃圾文件清理、快捷方式修复、文件粉碎程序、进程管理器、启动项管理器、系统服务管理器、计划任务管理器、资源管理器菜单项管理器、Windows系统还原管理器等功能。
23 2
|
2月前
|
Windows
Hasleo EasyUEFI v5.5单文件版
Hasleo EasyUEFI,轻松管理EFI/UEFI启动项 & 管理EFI系统分区 & 修复EFI系统启动问题!EasyUEFI是免费EFI启动管理软件,用于管理EFI/UEFI启动项,包括创建、删除、编辑、清理、备份和还原EFI/UEFI启动项。
31 0
|
2月前
文件
文件操作。
25 0
|
10月前
|
NoSQL Python
PythonExcel文件
在Python中,我们可以使用许多库来处理Excel文件,其中最常用的是pandas和openpyxl。
|
数据安全/隐私保护
p文件如何转为m文件
如果你是MATLAB爱好者,你一定知道MATLAB P文件,但是,你是否也和许多人一样,摸不着头脑?难道你也经常遇到MATLAB P文件加密问题,难以阅读和研究吗?那么,你需要一个MATLAB P文件解密工具!
|
编译器 数据库 C语言
文件(上)——“C”
文件(上)——“C”
|
存储 C语言
文件(下)——“C”
文件(下)——“C”
|
Go 数据安全/隐私保护 Windows
WinNTSetup V5.3.0 Bata5 单文件版
WinNTSetup 是一款Windows系统硬盘安装器,支持从PE和本地安装系统,支持支持NT内核的系统。
WinNTSetup V5.3.0 Bata5 单文件版