文件

知识点1【文件的格式化操作】0-1

1、fprintf 文件的写操作
void test03()
{
HERO hero[]={
{“德玛西亚”,80, 60},
{“盲僧”,90, 80},
{“小法”,40, 85},
{“小炮”,50, 90}
};
int n = sizeof(hero)/sizeof(hero[0]);
FILE *fp = NULL;
int i=0;

fp = fopen("hero.txt", "w");
if(fp == NULL)
{
	perror("fopen");
	return;
}

for(i=0;i<n;i++)
{
	fprintf(fp,"英雄:%s 防御:%d 攻击:%d\n",hero[i].name, hero[i].deff,hero[i].atk);
}

fclose(fp);

}
运行结果:

2、fscanf格式化 读操作
void test04()
{
HERO hero[4];
int i=0;
FILE *fp = NULL;
fp = fopen(“hero.txt”,“r”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

for(i=0;i<4; i++)
{
	fscanf(fp,"英雄:%s 防御:%d 攻击:%d\n", hero[i].name, &hero[i].deff, &hero[i].atk);
}

for(i=0;i<4; i++)
{
	printf("%s %d %d\n", hero[i].name, hero[i].deff, hero[i].atk);
}

fclose(fp);

}

运行结果:

总结:

知识点2【文件的随机读写】
1、知识点引入
void test05()
{
char buf[128]="";
FILE *fp = NULL;
fp = fopen(“a.txt”,“w+”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//先往文件中写入 一个字符串"hello file"
fputs("hello file", fp);
//fclose(fp);

//重新打开文件  让文件的流指针 回到 文件首部
//fp = fopen("a.txt","r");
//在从文件找那个读取 该字符串
fgets(buf,sizeof(buf), fp);
printf("buf=%s\n", buf);

fclose(fp);

}
上述代码:为啥出现这个现象()

解决上述文件 : 文件写完后 需要关闭 文件 然后重新打开文件 让文件流指针 指向文件开始位置 让变 下次的文件读操作
void test05()
{
char buf[128]="";
FILE *fp = NULL;
fp = fopen(“a.txt”,“w+”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//先往文件中写入 一个字符串"hello file"
fputs("hello file", fp);
fclose(fp);

//重新打开文件  让文件的流指针 回到 文件首部
fp = fopen("a.txt","r");
//在从文件找那个读取 该字符串
fgets(buf,sizeof(buf), fp);
printf("buf=%s\n", buf);

fclose(fp);

}
运行结果:

2、复位文件流指针 rewind 0-2

void test05()
{
char buf[128]="";
FILE *fp = NULL;
fp = fopen(“a.txt”,“w+”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//先往文件中写入 一个字符串"hello file"
fputs("hello file", fp);

//复位文件流指针(位置 指针)
rewind(fp);//注意

//在从文件找那个读取 该字符串
fgets(buf,sizeof(buf), fp);
printf("buf=%s\n", buf);

fclose(fp);

}

运行结果:

3、获得 文件流指针 距离 文件首部 的字节数 ftell

void test05()
{
char buf[128]="";
long file_len = 0;
FILE *fp = NULL;
fp = fopen(“a.txt”,“w+”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//先往文件中写入 一个字符串"hello file"
fputs("hello file", fp);

//获取 文件流指针 距离 文件首部的 字节数
file_len = ftell(fp);
printf("file_len = %ld\n", file_len);

fclose(fp);

}
运行结果:

4、定位 文件的流指针 fseek

位移量:-10 往左边移动10字节 +10往右边移动10字节
一次性读取文件总大小
oid test06()
{
char *file_data=NULL;
long file_len = 0;
FILE *fp = NULL;
fp = fopen(“a.txt”,“r”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//需求:一次性的将文件数据 读取到 内存中
//1、得到文件的总大小
//a、使用fseek 将文件指针 定位到文件尾部
fseek(fp, 0,  2);
//b、使用ftell计算文件的偏移量 == 文件的总大小
file_len = ftell(fp);
//c、使用rewind复位文件流指针
rewind(fp);

//2、根据文件的总大小 合理申请 内存空间
file_data = (char *)calloc(1,file_len+1);//+1的目的 内存末尾存放'\0'
if(file_data == NULL)
{
	fclose(fp);
	return;
}

//3、一次性 将文件数据 读入到 内存空间
fread(file_data, file_len, 1, fp);

//4、遍历读取到的文件内容
printf("file_len=%ld\n", file_len);
printf("%s\n", file_data);

//5、释放堆区空间
if(file_data != NULL)
{
	free(file_data);
	file_data = NULL;
}

//关闭文件
fclose(fp);

}
运行结果:

5、feof()函数 判断文件是否到达文件末尾
EOF宏 只能用于 文本文 文件
feof函数 可以用于 文本文文件 二进制文件
void test07()
{
FILE *fp = NULL;
fp = fopen(“a.txt”,“r”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//feof(fp) 判断文件是否 结束 0:未结束   非0:表示结束
//while( feof(fp) == 0)//文件未结束 才循环
while(  !feof(fp) )
{
	char ch = fgetc(fp);
	printf("%c", ch);
}

fclose(fp);

}
运行结果;

知识点3【文件加密器】
1、原理的分析
加密过程:

解密过程:

main.c
#include<stdio.h>
#include"fun.h"
int main(int argc,char *argv[])
{
while(1)
{
int cmd = 0;
print_help();

	scanf("%d", &cmd);
	
	if(cmd == 1)
	{
		char src_file[31]="";
		char dst_file[31]="";
		char *file_data = NULL;
		unsigned long file_length = 0;
		unsigned int passwd = 0;

		//1、获取源文件 目的文件名(参考API实现)
		get_file_name(dst_file, src_file);

		//2、获取源文件名 对应的文件 内容(参考API实现)
		//char * read_src_file(unsigned long *file_length,char *src_file_name)
		file_data = read_src_file(&file_length, src_file);

		//3、获取用户输入的密码(自定义实现)
		printf("请输入你的密码:");
		scanf("%u", &passwd);

		//4、对文件内容加密(参考API实现)
		file_data = file_text_encrypt(file_data,file_length,passwd);
		//char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password)
		
		//5、对加密好的 文件内容 保存到 目的文件名中
		save_file(file_data, file_length,dst_file);
		//void save_file(char* text,unsigned long int length,char * file_name)
	}
	else if(cmd == 2)
	{
		char src_file[31]="";
		char dst_file[31]="";
		char *file_data = NULL;
		unsigned long file_length = 0;
		unsigned int passwd = 0;
		
		//1、获取源文件 目的文件名(参考API实现)
		get_file_name(dst_file, src_file);
		//void get_file_name(char * dest_file_name,char * src_file_name)

		//2、获取源文件名 对应的文件 内容(参考API实现)
		file_data = read_src_file(&file_length, src_file);
		//char * read_src_file(unsigned long int *file_length,char *src_file_name)
		
		//3、获取用户输入的密码(自定义实现)
		printf("请输入你的密码:");
		scanf("%u", &passwd);

		//4、对文件内容解密(参考API实现)
		file_data = file_text_decrypt(file_data, file_length,passwd);
		//char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned int password)
		
		//5、对加密好的 文件内容 保存到 目的文件名中
		save_file(file_data, file_length,dst_file);
		//void save_file(char* text,unsigned long int length,char * file_name)
	}
	else if(cmd == 3)
	{
		break;
	}
	else
	{
		printf("请输入一个正确的选项\n");
	}

}

return 0;

}
fun.c
#include<stdio.h>
#include<stdlib.h>
void print_help(void)
{
printf(“1:加密文件****\n”);
printf(“2:解密文件****\n”);
printf(“3:退出程序****\n”);
}
void get_file_name(char * dest_file_name,char * src_file_name)
{
printf(“请输入你的源文件名称(30个字符):”);
scanf("%s", src_file_name);
printf(“请输入你的目的文件名称(30个字符):”);
scanf("%s", dest_file_name);
return;
}

char * read_src_file(unsigned long *file_length,char *src_file_name)
{
char *data = NULL;
FILE *fp = NULL;
fp = fopen(src_file_name,“r”);
if(fp == NULL)
{
perror(“fopen”);
return NULL;
}

//获取文件总长度
//将文件流指针 定位 到文件 尾部
fseek(fp,0,2);
//获取文件长度
*file_length = ftell(fp);
//复位文件流指针
rewind(fp);


//根据 文件的长度 申请 堆区空间
data = (char *)calloc(1,*file_length);
if(data == NULL)
{
	perror("calloc");
	return NULL;
}

//一次性 读取文件内容
fread(data, *file_length,1,fp);

fclose(fp);
//将空间首地址 返回
return data;

}
char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password)
{
int i=0;
for(i=0;i<length;i++)
{
src_file_text[i] += password;//加密的过程
}

return src_file_text;

}

void save_file(char* text,unsigned long int length,char * file_name)
{
FILE *fp = NULL;
fp = fopen(file_name, “w”);
if(fp == NULL)
{
perror(“fopen”);
return;
}

//将data数据保存到 文件中
fwrite(text, length, 1, fp);

fclose(fp);

//释放text指向堆区空间
if(text != NULL)
{
	free(text);
	text =NULL;
}

printf("保存成功!\n");
return;

}

char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned int password)
{
int i=0;
for(i=0;i<length;i++)
{
src_file_text[i] -= password;//解密的过程
}

return src_file_text;

}
fun.h
#ifndef FUN_H
#define FUN_H

extern void print_help(void);
extern void get_file_name(char * dest_file_name,char * src_file_name);
extern char * read_src_file(unsigned long *file_length,char *src_file_name);
extern char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password);

extern void save_file(char* text,unsigned long int length,char * file_name);
#endif

项目提示:
1:打开文件的时候用二进制方式打开进行读写。
2:测文件大小方法:
1)用fseek() 定位流指针到文件的末尾。
2)用ftell()函数测流指针的位置即文件的大小。
3:读文件内容:
1)根据文件的大小用malloc申请内存空间保存读出的内容
2)读文件数据的时候要从文件的开始读(rewind())。
详细设计API设计参考:

  1. 从键盘获取源文件和目的文件名字
    //
    //函数功能:获取 目的文件和源文件的名字
    //参数: src_file_name:源文件名字字符数组首地址。
    // dest_file_name:目的文件的名字字符数组首地址
    /
    /
    void get_file_name(char * dest_file_name,char * src_file_name)

  2. 从文件中读出内容
    //
    //函数功能:读出文件内容
    //参数:file_length:整型指针,此地址中保存文件字节数。
    // src_file_name:文件名字,从此文件中读取内容。
    // 返回值:读出字符串的首地址
    // 在此函数中测文件的大小,并malloc空间,再把文件内容读出返回,读出字符数组的首地址
    /
    /
    char * read_src_file(unsigned long int *file_length,char *src_file_name)

  3. 字符数组加密
    //
    //函数功能:加密字符串
    //参数:
    // src_file_text:要加密的字符串。 length:字符串的长度
    // password: 加密密码
    // 返回值: 加密后的字符串的首地址
    // 加密原理字符数组中每个元素加上password
    /
    /
    char * file_text_encrypt(char * src_file_text,unsigned long int length,unsigned int password)

  4. 解密字符串
    //
    //函数功能:解密字符串
    //参数:
    // src_file_text:要解密的字符串。 length:字符串的长度
    // password: 解密密码
    // 返回值: 解密后的字符串的首地址
    //思想;把数组中的每个元素减去password 给自己赋值。
    /
    /
    char * file_text_decrypt(char * src_file_text,unsigned long int length,unsigned int password)

  5. 保存文件
    //
    //函数功能:将字符串保存到目的文件中
    //参数:
    // text:要保存的字符串首地址
    // file_name :目的文件的名字
    // length:字符串的长度
    //思想:传入字符数组的首地址和数组的大小及保存后的文件的名字,即可保存数组到文件中
    /
    /
    void save_file(char* text,unsigned long int length,char * file_name)

  6. 打印文件信息
    //
    //
    // 函数功能:打印帮助信息
    //
    //
    /
    /
    void print_help()
    {
    printf(“1:加密文件***\n”);
    printf(“2:解密文件***\n”);
    printf(“3:退出程序***\n”);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值