🌈 个人主页:白子寰
🔥 分类专栏:魔法指针,进阶C++,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分79+),分享更多关于深度学习、C/C++领域的优质内容!(希望得到您的关注~)
目录
为什么要使用文件?
文件
程序文件
数据文件
文本文件
二进制文件
文件名
⽂件的打开和关闭
流和标准流
一图 KO 流 概念
标准流
文件指针
文件的打开和关闭
文件的打开模式
文件的顺序读写
文件顺序读写函数
函数原型
一个数据在内存中怎么储存的呢?
fputc
文件的随机读写
fseek
ftell
rewind
为什么要使用文件?
要将数据持久化保存
文件
按文件功能分类,文件分为两种:
程序文件 和 数据文件
程序文件
后缀名为①.c ②.obj ③.exe
数据文件
文件的内容不一定是程序,而是程序运行读写的数据
如:程序运行时要从中读取数据文件内容/输出内容文件
根据数据的组织形式,数据文件被称为文本文件或二进制文件
文本文件
数据在内存中以二进制形式储存,不加转换输出到外存
二进制文件
数据在外存以ASCII码形式存储,在存储前转换(以ASCII字符的形式存储的文件)
一个数据在内存中怎么储存的呢?
在下面👇 “文件的打开和关闭” 讲到
文件名
文件名包含三部分:
文件路径 + 文件名主干 + 文件后缀
⽂件的打开和关闭
流和标准流
一图 KO 流 概念
标准流
C语⾔程序在启动的时候,默认打开了3个流:
① stdin-标准输入流,在大多数的环境中从键盘输⼊,
scanf函数就是从标准输入流中读取数据。
②stdout-标准输出流,大多数的环境中输出至显示器界面,
printf函数就是将信息输出到标准输出流中。
③stderr-标准错误流,大多数环境中输出到显示器界面。
文件指针
运行程序时,默认打开了这三个流,我们使⽤scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: C语⾔中,就是通过 FILE* ,通常称为文件指针。
FILE* 的⽂件指针来维护流的各种操作的。
该结构体类型是由系统声明的,取名FILE.
通过文件指针变量能够间接找到与它关联的文件
FILE* pf;//文件指针变量
文件的打开和关闭
文件在读写之前打开文件,在使用结束后关闭文件
mode打开方式
文件的打开模式
文件使用方式 | 含义 | 如果指定文件不存在 |
"r"(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
"w"(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
"a"(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
函数使用
#include<stdio.h>
int main()
{
//文件指针变量读写文件
// 当前文件位置
//FILE* pf = fopen("data.txt", "w");
//当前文件位置
FILE* pf = fopen("./data.txt", "w");
//当前文件的上一级位置
//FILE* pf = fopen("./../data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
文件的顺序读写
文件顺序读写函数
函数名 | 功能 | 适用于 |
fgetc | 字符输入函数 | 所有输入流 |
fputc | 字符输出函数 | 所有输出流 |
fgets | 文本行输入函数 | 所有输入流 |
fputs | 文本行输出函数 | 所有输出流 |
fscanf | 格式化输入函数 | 所有输入流 |
fprintf | 格式化输入函数 | 所有输出流 |
fread | 二进制输入 | 文件 |
fwrite | 二进制输出 | 文件 |
函数原型
回到上面的 “二进制文本” 提到的问题
一个数据在内存中怎么储存的呢?
int main()
{
int a = 100;
//文件指针变量打开文件
FILE* pf = fopen("Data.txt", "wb");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//以二进制方式写入文件
fwrite(&a, 4, 1, pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
内存中以二进制显示:
用的比较多的是fputc
fputc
函数使用
int main()
{
//文件指针打开文件
FILE* pf = fopen("Data.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//输入数据读写文件:26个字母
//int i = 0;
//for (i = 0; i < 26; i++)
//{
// fputc('a' + i, pf);
// fputc('\n', pf);
//}
//控制台输出stdout
int i = 0;
for (i = 0; i < 26; i++)
{
fputc('a' + i, stdout);
fputc('\n', stdout);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
文件的随机读写
fseek
函数介绍
函数使用
int main()
{
//文件指针打开文件
FILE* pf = fopen("Data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读写文件
int ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, 3, SEEK_SET);
ch = fgetc(pf);
printf("%c\n", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
控制台显示
ftell
函数介绍
int main()
{
//文件指针打开文件
FILE* pf = fopen("Data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读写文件
int ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
int n = ftell(pf);
printf("%d\n", n);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
控制台显示
rewind
函数介绍
作用:返回文件起始位置(文件开头)
函数使用
int main()
{
//文件指针打开文件
FILE* pf = fopen("Data.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读写文件
int ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);
rewind(pf);
ch = fgetc(pf);
printf("%c\n", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
控制台输出
***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。
等等等等一下,分享最近喜欢的一句话:“关关难过关关过,前路漫漫亦灿灿”。
我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!!
好了划走把。