今天咱们来看一看C语言文件部分,简单实用!
知识点1【文件的概述】
文件的分类:文本文件 二进制文件
文本文件:是基于字符编码
二进制文件:是基于值编码
文本文件 和 二进制文件的对比:
知识点2【文件指针】
文件的操作步骤:
1、打开文件
2、读写文件
3、关闭文件
知识点3【文件的打开 fopen】
谈一谈mode的格式:
r只读 w只写 a追加 +可读可写 t文本文件(默认省略) b(二进制文件)
文件的关闭
知识点4【一次读写一个字符】
写一个字符:fputc
案例:
void test03() { char msg[128]=""; printf("请输入你要写入文件的字符串\n"); fgets(msg,sizeof(msg), stdin); //fopen打开一个文件 FILE *fp = fopen("a.txt", "w"); if(fp == NULL) { perror("fopen"); return; } //操作文件fputc int i=0; while(msg[i] != '\0') { fputc(msg[i++], fp); } //关闭文件 fclose(fp); }
运行结果:
a.txt
读一个字符:fgetc
EOF只适用于 文本文件 -1
feof()文本文件 和二进制文件都可以用
案例:
void test04() { //以只读的方式打开文件 FILE *fp = fopen("a.txt", "r"); if(fp == NULL) { perror("fopen"); return; } //操作文件 char msg[128]=""; int i=0; while((msg[i++]= fgetc(fp)) != EOF); msg[i-1] = 0; printf("msg = %s\n", msg); //关闭文件 fclose(fp); }
运行结果:
知识点5【字符串 读写】
写:fputs
void test05() { FILE *fp = fopen("a.txt", "w"); if(fp == NULL) { perror("fopen"); return; } char *msg[] = {"床前明月光\n","疑似地上霜\n", "举头望明月\n","低头思故乡"}; int n = sizeof(msg)/sizeof(msg[0]); int i=0; for ( i = 0; i
运行结果:
读:
void test06() { FILE *fp = fopen("a.txt", "r"); if(fp == NULL) { perror("fopen"); return; } char buf[128]=""; while(fgets(buf,sizeof(buf), fp)) { printf("buf=%s\n",buf); } fclose(fp); }
运行结果:
知识点6【文件的块读写】
将内存数据 原样写入磁盘中 将磁盘数据 原样 读取到内存中 不会对数据作任何转换
如果文件 不输出屏幕上 建议 用文件的块读写
写:
typedef struct { char name[8];//英雄的姓名 int def;//防御 int atk;//攻击 }HERO; void test07() { HERO hero[]= { {"德玛", 90, 40}, {"提莫", 30, 120}, {"盲僧", 60, 80} }; int n = sizeof(hero)/sizeof(hero[0]); FILE *fp = fopen("a.txt", "w"); if(fp == NULL) { perror("fopen"); return; } //块写 fwrite(hero,sizeof(HERO), n, fp); fclose(fp); }
运行结果:
读:
#include void test08() { HERO hero[3]; memset(hero,0,sizeof(HERO)); FILE *fp = fopen("a.txt", "r"); if(fp == NULL) { perror("fopen"); return; } //块写 fread(hero,sizeof(HERO), 3, fp); int i=0; for ( i = 0; i
运行结果:
案例:fread读到的块数
知识点7【格式化文件读写】按照特定的便于阅读的格式将数据写入文件(方便查看,代价存在数据的转换 效率低)
格式化写:fprintf
void test10() { HERO hero[]= { {"德玛", 90, 40}, {"提莫", 30, 120}, {"盲僧", 60, 80} }; int n = sizeof(hero)/sizeof(hero[0]); FILE *fp = fopen("a.txt", "w"); if(fp == NULL) { perror("fopen"); return; } //格式化写 int i=0; for (i = 0; i
运行结果:
格式化读:fscanf
#include void test11() { HERO hero[3]; memset(hero,0,sizeof(HERO)); FILE *fp = fopen("a.txt", "r"); if(fp == NULL) { perror("fopen"); return; } int i=0; for ( i = 0; i
运行结果:
知识点8【文件的随机读写】
引入:顺序读写
1、rewind()复位文件流指针
2、ftell返回文件流指针 距离文件首部的字节偏移量
3、fseek定位文件流指针位置
案例:测量文件的总大小 并一次性读取文件的全部数据
1、使用fseek将文件的流指针定位到文件尾部
2、使用ftell得到文件流指针的偏移量 == 文件的总大小
3、根据文件的总大小 申请堆区空间
4、复位文件流指针rewind
5、一次型读取数据
#include #include void test01() { FILE *fp = fopen("b.txt", "r"); //将文件流指针定位到文件尾部 fseek(fp,0, 2); //通过ftell获取文件的总大小 long len = ftell(fp); printf("len = %ld\n", len); //申请空间 char *file = (char *)calloc(1,len+1); //复位文件流指针 rewind(fp); //读取文件数据 fread(file,len,1,fp); printf("file=%s\n", file); //释放堆区空间 if(file != NULL) { free(file); file=NULL; } fclose(fp); } int main(int argc, char const *argv[]) { test01(); return 0; }
运行结果:
练习:文件加密(大家可以试试呀)