本文共 3516 字,大约阅读时间需要 11 分钟。
原标题:技术分享:C语言编程
今天咱们来看一看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 < n; i++)
{
fputs(msg[i], fp);
}
fclose(fp);
}
运行结果:
读:
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 < 3; i++)
{
printf("name=%s, def=%d, atk=%d\n", \
hero[i].name, hero[i].def, hero[i].atk);
}
fclose(fp);
}
运行结果:
案例: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 < n; i++)
{
fprintf(fp,"英雄:%s 防御:%d 攻击:%d\n",\
hero[i].name, hero[i].def, hero[i].atk);
}
fclose(fp);
}
运行结果:
格式化读: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);
}
运行结果:
知识点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;
}
运行结果:
练习:文件加密(大家可以试试呀)
责任编辑:
转载地址:http://neudv.baihongyu.com/