文章目录
一、文件的分类
从文件的功能考虑分为 程序文件和 数据文件
程序文件包括(后缀为.c)的源程序文件,(后缀为.obj)的目标文件,(后缀为.exe)的可执行程序
数据文件为程序运行时读写的数据
二、文件的打开和关闭
1.文件指针
有一个文件, 与其绑定一个文件信息区,该文件信息区可以看作是一个结构体的变量
用typedef后 重命名为FILE
2.文件打开
用 fopen打开这个文件,主动创建文件信息区,将文件信息区的地址传递过来
filename 为文件名 mode为文件的打开方式
fopen文件打开失败会返回NULL
(1).文件打开方式
“w"为打开文件 如果不存在这个文件 使用"w"就会自动创建一个空文件
每次使用"w” , 如果文件中存在内容 就会被销毁
“r” 读文件 如果找不到文件 就会报错
2.文件关闭
stream代表流
#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","w");//打开文件if(pf==NULL)//文件打开失败就报错{perror("fopen");return1;}fclose(pf);//关闭文件
pf=NULL;return0;}
三、文件的顺序读写
注意事项
在文件中的输入输出跟以往的不太相同
输入——代表的是从文件中输入到内存中 即读取
输出——代表的是从内存到文件中输出 即写入
流的概念
一个高度抽象的概念
正常来说 程序是需要多个转换方式到各个外部设备中 而流则作为一个转换中介的功能
通过程序往流中输入数据,在通过流找到外部设备的读写方式
1.字符输出函数——fputc
写文件
c为 字符 而返回值int代表ASCII值
stream代表流
将字符传递到流中
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","w");//打开text.txt文件 以写的方式if(pf==NULL)//判断文件是否打开失败{perror("fopen");return1;}fputc('a',pf);//将字符传递到流中foutc('b',pf);fputc('c',pf);fclose(pf);//关闭文件
pf=NULL;return0;}
2.字符输入函数——fgetc
读文件
sream代表流
读一个文件在一个流中
如果读取正常返回字符的ASCII值
如果读取失败返回 或者文件结束返回EOF
关于返回类型为int的原因:>
EOF为文件结束标志 值为-1
字符的ASCII值可以当作整形计算
即 返回类型为int
#define_CRT_SECURE_NO_WARNINGS//在VS中关闭文件所要求的#include<stdio.h>intmain(){
FILE*pf=fopen("test.txt","r");//从文件test.txt中读if(pf==NULL)//假设test.txt里面为abcd{perror("fopen");return1;}int ret=fgetc(pf);printf("%c\n",ret);//a
ret=fgetc(pf);printf("%c\n",ret);//b
ret=fgetc(pf);printf("%c\n",ret);//cfclose(pf);
pf=NULL;return0;}
3.文本行输出函数——fputs
写文件
string代表字符串
sream代表流
用一行写入文件中
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","w");if(pf==NULL){perror("fopen");return1;}fputs("abcdef\n",pf);fputs("qwerty\n",pf);fclose(pf);
pf=NULL;return0;}
4.文本行输入函数——fgets
读一个字符串在流中
string 代表字符串
stream代表流
n代表最多读取的字符个数
因为读取出来的是字符串 要加\0 故 n-1为实际读取的字符数
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","r");//假设文件中为abcdefgif(pf==NULL){perror("fopen");return1;}char arr[40={0};fgets(arr,4,pf);printf("%s\n",arr);//a b cfgets(arr,4,pf);printf("%s\n",arr);// d e ffclose(pf);
pf=NULL;return0;}
5.格式化输出函数——fprintf
对格式化的数据 写文件
stream代表流
format代表格式(%s %d)
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>structS{char name[20];int age;char sex[20];}intmain(){structS s={"张三",18,"男");
FILE*pf=fopen("test.txt","w");if(pf==NULL){perror("fopen");return1;}fprintf(pf,"%s %d %s",s.name,s.age,s.sex);fclose(pf);
pf=NULL;return0;}
6.格式化输入函数——fscanf
stream代表流
format代表格式
从文件中读取一个格式化的数据
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>structS{char name[20];int age;char sex[20];}intmain(){structS s={"张三",18,"男");
FILE*pf=fopen("test.txt","r");if(pf==NULL){perror("fopen");return1;}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;return0;}
7.二进制输出函数———fwrite
按二进制的方式写文件
buffer 指向被写的数据
size 为字节数
count为最多写多少个元素
stream代表流
将数据的地址,字节数,元素个数 传入流中
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>structS{char name[20];int age;char sex[20];}intmain(){structS s={"张三",18,"男");
FILE*pf=fopen("test.txt","w");if(pf==NULL){perror("fopen");return1;}fwirte(&s,sizeof(structS),1,pf);fclose(pf);
pf=NULL;return0;}
7.二进制输入函数———fread
以二进制的方式读文件
从流中读取 数据的地址 字节数 元素个数
返回值为实际完整读取的个数
想要结束读取时 看实际读取的完整个数是否小于元素个数 为即将停止的临界
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>structS{char name[20];int age;char sex[20];}intmain(){structS s={"张三",18,"男");
FILE*pf=fopen("test.txt","r");//读文件if(pf==NULL){perror("fopen");return1;}fread(&s,sizeof(structS),1,pf);printf("%s""%d""%s",s.name,s.age,s.sex);打印
fclose(pf);
pf=NULL;return0;}
三、文件的随机读写
1.fseek
fseek来判断文件指针的位置和偏移量来定位文件指针
移动文件指针到特定位置
stream代表流
offset代表偏移量
origin代表起始位置
关于起始位置的三种状态:
SEEK_CUR表示从当前文件指针的位置开始偏移
SEEK_END表示从文件末尾开始偏移
SEEK_SET表示从文件的起始位置开始偏移
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读if(pf==NULL)//假设文件中为abcdef{perror("fopen");return1;}int ret=fgetc(pf);printf("%c\n",ret);//afseek(pf,-2,SEEK_END);
ret=fgetc(pf);printf("%c\n",ret);//e
ret=fgetc(pf);printf("%c\n",ret);//ffclose(pf);
pf=NULL;return0;}
这里要注意使用SEEK_END是从最后一个字符的后一个位置开始
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读if(pf==NULL)//假设文件中为abcdef{perror("fopen");return1;}int ret=fgetc(pf);printf("%c\n",ret);//afseek(pf,2,SEEK_SET);
ret=fgetc(pf);printf("%c\n",ret);//c
ret=fgetc(pf);printf("%c\n",ret);//dfclose(pff);
pf=NULL;return0;}
SEEK_SET从第一个字符开始
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读if(pf==NULL)//假设文件中为abcdef{perror("fopen");return1;}int ret=fgetc(pf);printf("%c\n",ret);//afseek(pf,2,SEEK_CUR);//来到这里时已经指向b的流 所以从b开始向后2个
ret=fgetc(pf);printf("%c\n",ret);//d
ret=fgetc(pf);printf("%c\n",ret);//efclose(pf);
pf=NULL;return0;}
2.ftell
ftell返回文件指针相对起始位置的偏移量
stream代表流
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读if(pf==NULL)//假设文件中为abcdef{perror("fopen");return1;}int ret=fgetc(pf);printf("%c\n",ret);//afseek(pf,-1,SEEK_END);
ret=fgetc(pf);//fprintf("%c\n",ret);//相对于起始位置的偏移量为5fclose(pf);
pf=NULL;return0;}
3.rewind
让文件指针位置回到文件的起始位置
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
FILE*pf=fopen("text.txt","r");//这里是从已经存好数据的文件中读if(pf==NULL)//假设文件中为abcdef{perror("fopen");return1;}int ret=fgetc(pf);printf("%c\n",ret);//afseek(pf,-1,SEEK_END);rewind(pf);//文件指针回到起始位置
ret=fgetc(pf);printf("%c\n",ret);//afclose(pf);
pf=NULL;return0;}
四.文件读取的判定
- feof函数为判断报错是 正常遇到文件尾结束 还是读取失败报错 (不使用于 判断是否报错的函数)
- fgetc函数 从流中读取字符 读取结束时 返回EOF 正常情况下返回字符的ASCII值
- fgets函数 从流中读取字符串 读取结束时 返回NULL 正常 情况下 返回 字符串的起始地址
- fread函数 二进制写文件 返回实际读取的完整元素的个数 结束的临界条件为:实际读取的完整元素的个数<指定元素个数
版权归原作者 风起、风落 所有, 如有侵权,请联系我们删除。