当前位置:网站首页>C杂讲 文件 续讲
C杂讲 文件 续讲
2022-07-06 09:04:00 【Bright-SKY】
目录
知识点1【文件块的格式化读写】(重要)
fprintf(写) fscanf(读)
1、fprintf 文件的写操作
void test06()
{
HERO hero_buf[]={
{"德玛西亚", 80, 60}, {"小炮", 40, 80}, {"小法",50, 90}};
FILE *fp = NULL;
fp = fopen("hero.txt", "w");
if(fp == NULL)
{
perror("fopen");
return;
}
int i=0;
for ( i = 0; i < 3; i++)
{
fprintf(fp,"姓名:%s 防御:%d 攻击:%d\n", \
hero_buf[i].name,hero_buf[i].def,hero_buf[i].atk);
}
fclose(fp);
}
2、fscanf格式化 读操作
void test07()
{
HERO hero_buf[3];
memset(hero_buf, 0, sizeof(hero_buf));
FILE *fp = NULL;
fp = fopen("hero.txt", "r");
if(fp == NULL)
{
perror("fopen");
return;
}
int i=0;
for ( i = 0; i < 3; i++)
{
fscanf(fp,"姓名:%s 防御:%d 攻击:%d\n", \
hero_buf[i].name, &hero_buf[i].def,&hero_buf[i].atk);
}
for ( i = 0; i < 3; i++)
{
printf("%s %d %d\n", hero_buf[i].name, hero_buf[i].def,hero_buf[i].atk);
}
fclose(fp);
}
总结:
字节操作:fgetc fputc
字符串操作:fgets fputs
块操作:fread fwrite
格式化操作:fscanf fprintf
知识点2【文件的随机读写】(重要)
文件默认 顺序读写
知识点的引入:
void test01()
{
FILE *fp = NULL;
fp = fopen("c.txt", "w+");
if(fp == NULL)
{
perror("fopen");
return;
}
fputs("hello world", fp);
fclose(fp);
fp = fopen("c.txt", "r");
char buf[1024]="";
fgets(buf, sizeof(buf), fp);
printf("buf=%s\n",buf);
fclose(fp);
}
解决上述文件 : 文件写完后 需要关闭 文件 然后重新打开文件 让文件流指针 指向文件开始位置 让变 下次的文件读操作
文件的随机读写:移动文件的流指针
rewind ftell fseek
1、rewind 复位文件流指针
void rewind(FILE *stream)
void test01()
{
FILE *fp = NULL;
fp = fopen("c.txt", "w+");
if(fp == NULL)
{
perror("fopen");
return;
}
fputs("hello world", fp);
//复位文件流指针
rewind(fp);
char buf[1024]="";
fgets(buf, sizeof(buf), fp);
printf("buf=%s\n",buf);
fclose(fp);
}
2、ftell 测文件读写位置距文件开始有多少个字节
long ftell(FILE *stream);
3、fseek 定位位置指针(读写位置)
int fseek(FILE *stream, long offset, int whence)
案例1:将文件流指针 定位到文件的尾部
fseek(fp, 0, 2);
案例2:将文件数据 一次性读取到内存
#include <stdlib.h>
#include <string.h>
void test02()
{
FILE *fp = NULL;
fp = fopen("a.txt", "r");
if(fp == NULL)
{
perror("fopen");
return;
}
//获取文件总大小
fseek(fp, 0, 2);//将文件流指针 定位到文件尾部
long len = ftell(fp);//获取文件的大小
rewind(fp);//复位文件流指针(方便后续读取文件数据)
printf("len = %ld\n", len);
//根据文件总大小申请空间
unsigned char *data = NULL;
data = (unsigned char *)calloc(1, len+1);
fread(data, len, 1, fp);
printf("%s\n", data);
free(data);
fclose(fp);
}
4、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");
}
边栏推荐
猜你喜欢
在CANoe中通过Panel面板控制Test Module 运行(初级)
Mapreduce实例(六):倒排索引
Which is the better prospect for mechanical engineer or Electrical Engineer?
Hero League rotation chart manual rotation
Hero League rotation map automatic rotation
嵌入式开发中的防御性C语言编程
Mapreduce实例(十):ChainMapReduce
软件负载均衡和硬件负载均衡的选择
《ASP.NET Core 6框架揭秘》样章发布[200页/5章]
Nc29 search in two-dimensional array
随机推荐
单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)
Mapreduce实例(五):二次排序
嵌入式开发中的防御性C语言编程
Take you back to spark ecosystem!
Control the operation of the test module through the panel in canoe (Advanced)
018.有效的回文
Selection of software load balancing and hardware load balancing
How can I take a shortcut to learn C language in college
Interview shock 62: what are the precautions for group by?
面试突击62:group by 有哪些注意事项?
Redis分布式锁实现Redisson 15问
DCDC power ripple test
MapReduce instance (VII): single table join
[Chongqing Guangdong education] reference materials for nine lectures on the essence of Marxist Philosophy in Wuhan University
【深度学习】语义分割:论文阅读:(2021-12)Mask2Former
Cooperative development in embedded -- function pointer
Hero League rotation map automatic rotation
MapReduce instance (VI): inverted index
【深度学习】语义分割:论文阅读(NeurIPS 2021)MaskFormer: per-pixel classification is not all you need
在CANoe中通过Panel面板控制Test Module 运行(初级)