文件的概念
- 文件指的是一组相关数据的有序集合
- 文件是驻留在外部介质上的,在使用时才调用内存
文件的分类
分类一
- 程序文件:包括源程序文件(后缀.c),目标文件(windows后缀名.obj),可执行程序(windows后缀名.exe)
- 数据文件:程序运行时读写的数据,
分类2,从用户的角度分类
- 普通文件
- 设备文件:与主机相联的各种外部设备
分类3,从文件编码的方式来看
- ASCII文件 :以ASCLL字符的形式存储也称文本文件,按字符显示,因此能读懂
- 二进制文件:文件在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件
文件名
- 一个文件要有一个唯一的文件标识
- 文件名包含三部分:文件路径+文件名主干+文件后缀
文件缓冲区
- ANSIC标准采用“缓冲文件系统”处理的数据文件
- “缓冲文件系统”就是系统自动的在内存中每一各正在使用的文件开辟一块“文件缓冲区”
- 内存向磁盘输出数据,先经过内存中的缓冲区,装满后一起送到磁盘上
- 磁盘向计算机读入数据,则从磁盘文件中读取数据先输入到内存缓冲区,充满后,再将数据送到程序数据区
- 缓冲区的大小根据c编译系统决定
文件指针 FILE * pf
- C语言用一个指针变量指向一个文件,对文件进行操作
- 用来存放文件的相关信息(文件的名字,文件状态,文件位置),保存在结构体变量中,该结构体类型是有系统声明的,取名FILE
- FILE必须大写
FILE *fp;
//文件指针变量
//将fp笼统的称为指向文件的指针,其实是表示为指向FILE结构体的指针变量
//通过fp即可找存放某个文件信息的结构体变量
文件的打开fopen
- 格式: 文件指针名 =fopen(文件名,文件打开方式);
- 文件指针名必须时被说明为FILE类型的指针变量
- “文件名”是被打开文件的文件名,,文件名必须是字符串常量或字符数组
- “文件使用方式”是指文件的类型和操作要求
- 每当打开一个文件的时候,系统会根据文件自动创建一个FILE结构的变量,并填充其中信息
- 有绝对路径和相对路经
- 标准输入文件(键盘stdin),标准输出文件(显示器stdout),标准出错输出(出错信息)是由系统打开的,可直接使用
FILE *fp=fopen(test.txt,"r");
//当文件不存在时fopen将会创建这个文件
r:打开一个文本文件只读
w:打开一个文本文件只写 ,不存在则指定建立,存在则覆盖
a:对一个文本文件添加
rb:打开一个二进制文件只读
wb:打开一个二进制文件只写
ab:对一个二进制文件添加
r+:打开一个文本文件读/写
w+:生成一个文本文件读/写
a+:打开一个文本文件读/写 ,只有’a’可以向一个已存在的文件追加信息
rb+:打开二进制文件读/写
wb+:生成二进制文件读/写
ab+:打开二进制文件读/写
文件的关闭fclose
- 正常关闭文件时,fclose函数的返回值为0,若非0,表示出错
- 格式: fclose(文件指针); n
fclose(fp);//关闭文件
文件的顺序读写
-
必须先行创建#include <studio.h>
-
字符读写函数:fgetc和fputs//每次可从文件读出或向文件写入一个字符
格式: 字符变量=fgetc(文件指针);
格式: 字符变量=fgetc(字符量,文件指针); -
字符串读写函数:fgets和fputs//从指定的文件中读入一个字符串到字符数组
格式: fgets(字符数组名,n,文件指针);
格式: fputs(“字符串”,文件指针); -
数据块读写函数:freed和fwrite
int main()
{
FILE *pf=fopen(test.txt,"r");
if(pf==NULL)
{
printf("%s\n",strerror(errno));//检查打开文件是否为出错
return 0;
}
//字符写入
fputc('b',pf);
fputc('c',pf);
fputc('d',pf);
//字符读出,然后输出到屏幕上
printf("%s",fgetc(pf);)//b//每次使用fgets函数后,(文件的内部位置指针系统自动设置)该位置指针向后移动一个字符,因此,实现读取多个字符
printf("%s",fgetc(pf);)//c
printf("%s",fgetc(pf);)//d
//字符串的读入
char shuzu[1024]={0};//创建字符数组
//键盘输入,显示器输出
fgets(shuzu,1024,stdin);//从键盘读取(标准输入流读取)
fputs(shuzu,stdout);//输出到标准输出流
fgets(shuzu,1024,pf);//把pf字符串读取到shuzu,文本行输出函数
printf("%s",shuzu);
puts(shuzu)//读取一行打印在显示器上,puts函数天生会换行
//字符串的写入
fputs("hello\n",pf);//写一行,文本行输入函数
fputs("world\n",pf);
格式化函数
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s={100,3.14f,"bit"}
FILE *pf=fopen(test.txt,"r");
if(pf==NULL)
{
printf("%s\n",strerror(errno));
return 0;
}
//针对所有输入流/标准输出流的格式化输入/输出语句
//格式化函数的读写对象不是键盘和显示器,而是磁盘文件
//格式化输入
fscanf(pf,"%s,%f,%s",&(s.n),&(s.score),s.arr);
//格式化输出
fprintf(pf,"%s,%f,%s",s.n,s.score,s.arr);
//键盘输入,显示器输出
fscanf(stdin,"%s,%f,%s",&(s.n),&(s.score),s.arr);
fprintf(stdout,"%s,%f,%s",s.n,s.score,s.arr);
//针对标准输入流/标准输出流的格式化输入/输出语句
printf("%s,%f,%s",s.n,s.score,s.arr);
scanf("%s,%f,%s",&(s.n),&(s.score),s.arr);
//关闭文件
flose(pf);
pf=NULL;
return 0;
}
文件结束检测函数feof
调用格式:
feof(文件指针)//判断文件是否处于文件结束位置,若文件结束,返回值为1,否则返回值为0
文件的随机读写
- 实现随机读写的关键,是按要求移动位置指针,者称为文件的定位
rewind(FILE*fp);//用来将位置指针移动到文件开头,q
SEEK_SET 表示文件指针的开头
SEEK_CUR 表示文件指针的当前位置
SEEK_END 表示文件指针的末尾
fseek(指针,偏移量,文件指针的当期位置)//定位文件指针,用来将位置指针移动到任意位置
ftell(pf)//返回文件指针相对于起始位置的偏移量
ferror(文件指针);//目的检测调用各种输入输出函数进行读写时是否出错,函数初始值为0,出现错误,则非0值
clearerr(文件指针)//文件出错标志和文件结束标志,清除出错标志,使非任溶溶函数产生的非0值重新变为0
fclose(in);
fclose(out);
fcloseall();//用于关闭所有已经打开的文件
二进制文件的随机读写
fread()
fwrite()
花神博客生涯之C语言(文件的输入输出篇)结束了哦~
接下来会持续更新(⊙o⊙)!