博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言编程技术分享,技术分享:C语言编程
阅读量:5106 次
发布时间:2019-06-13

本文共 3516 字,大约阅读时间需要 11 分钟。

原标题:技术分享:C语言编程

今天咱们来看一看C语言文件部分,简单实用!

知识点1【文件的概述】

文件的分类:文本文件 二进制文件

文本文件:是基于字符编码

392ccae8064def6da036b0760f8e5f20.png

二进制文件:是基于值编码

cc7d2c3a989340311754b30ab5435853.png

文本文件 和 二进制文件的对比:

9fb464631dcd2f1440cc793121320b9f.png

知识点2【文件指针】

db80c472d4ad399b653f1760b778d857.png

ff5d4b59f0a7a121e1b331a7a6cfe9aa.png

文件的操作步骤:

1、打开文件

2、读写文件

3、关闭文件

aefdc22b8187b2802fd4217fe27cd919.png

3d5f244fb992aabfed977c3a6b3f4ae5.png

知识点3【文件的打开 fopen】

ff0041056ab2a568fedb93fd409ee578.png

谈一谈mode的格式:

r只读 w只写 a追加 +可读可写 t文本文件(默认省略) b(二进制文件)

a25b6db508291d0596deef7a9d1a57db.png

7a59149e936c5d23c7df605301478515.png

226d9e0078ed6b41697fe4529dcaed52.png

c9dd0c01381af5a7c1a6c9804b0daa45.png

文件的关闭

3b6a468390c6d8be852aaf236785d310.png

知识点4【一次读写一个字符】

写一个字符:fputc

64131f98f4305201f86290178380ccc5.png

案例:

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); }

运行结果:

e2e80689d92ad81ee5bc68d8196076ed.png

a.txt

db91b285cdae62fd2c5f0de12c5005b4.png

读一个字符:fgetc

ab02d4ddc552d1be17adf958a3658b15.png

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);

}

运行结果:

61d93e71cc71d321499f973138239b4b.png

知识点5【字符串 读写】

写:fputs

f551772e0a39b1d8324da612b657fb3b.png

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 < n; i++)

{

fputs(msg[i], fp);

}

fclose(fp);

}

运行结果:

b2fa673d702e091b71dde2525b5bbf2b.png

读:

4c99b6105df282faa61c353a26023158.png

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);

}

运行结果:

ceef96d13027ec02702cefdd93d25ba4.png

知识点6【文件的块读写】

将内存数据 原样写入磁盘中 将磁盘数据 原样 读取到内存中 不会对数据作任何转换

如果文件 不输出屏幕上 建议 用文件的块读写

写:

aaa387c7cf6be9164b197756b4cde2a5.png

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);

}

运行结果:

1c75bb84dc2b6d6f941ecc48162cc5a2.png

读:

6a0d8a9e2802e2fb94eb67ea1436f50f.png

#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 < 3; i++)

{

printf("name=%s, def=%d, atk=%d\n", \

hero[i].name, hero[i].def, hero[i].atk);

}

fclose(fp);

}

运行结果:

50e3aa01e9c966f1bb8d6f8ce22fd760.png

案例:fread读到的块数

3953128aa37a1d3af75969f5770d96cc.png

知识点7【格式化文件读写】按照特定的便于阅读的格式将数据写入文件(方便查看,代价存在数据的转换 效率低)

3017cc8b6caa405b12aa93aef68b556e.png

格式化写: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 < n; i++)

{

fprintf(fp,"英雄:%s 防御:%d 攻击:%d\n",\

hero[i].name, hero[i].def, hero[i].atk);

}

fclose(fp);

}

运行结果:

c3b858d65c2ece79f4934186c46837d5.png

格式化读: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 < 3; i++)

{

fscanf(fp,"英雄:%s 防御:%d 攻击:%d\n",\

hero[i].name, &hero[i].def, &hero[i].atk);

}

for ( i = 0; i < 3; i++)

{

printf("name=%s, def=%d, atk=%d\n", \

hero[i].name, hero[i].def, hero[i].atk);

}

fclose(fp);

}

运行结果:

da591f200fa2e5e332137db22d301264.png

知识点8【文件的随机读写】

引入:顺序读写

9a1029f2a5b16df1669fecb1a8795bfe.png

1、rewind()复位文件流指针

2b4ff056d50288f8ab2188ac03801698.png

91a51a2643a1585f1956c3c9bfa00272.png

5d8299aefca54d4acf4a2ea661bb184b.png

2、ftell返回文件流指针 距离文件首部的字节偏移量

c3ea88a012a1993fcec934b227542ed4.png

fa8824ba0e0bafa60e427398de0de1bd.png

3、fseek定位文件流指针位置

b99dcc673fb4a00fec059b918e101e9c.png

案例:测量文件的总大小 并一次性读取文件的全部数据

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;

}

运行结果:

295433d0abe8f03bb46dd679602762f7.png

练习:文件加密(大家可以试试呀)

责任编辑:

转载地址:http://neudv.baihongyu.com/

你可能感兴趣的文章
vim工具
查看>>
MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?...
查看>>
我最宏大的个人愿望
查看>>
北漂周记--第5记--拼命编程
查看>>
比赛总结一
查看>>
SpringBoot项目打包
查看>>
JSP的3种方式实现radio ,checkBox,select的默认选择值
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>
第一个Spring冲刺周期团队进展报告
查看>>
C++函数基础知识
查看>>
红黑树 c++ 实现
查看>>
Android 获取网络链接类型
查看>>
报表服务框架:WEB前端UI
查看>>
5.9UDP客户端服务器-基于OK6410
查看>>
java自学基础、项目实战网站推荐
查看>>
软件包的使用
查看>>
linux中启动与终止lnmp的脚本
查看>>