当前位置:网站首页>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");
}
边栏推荐
猜你喜欢
Several silly built-in functions about relative path / absolute path operation in CAPL script
Defensive C language programming in embedded development
英雄联盟轮播图自动轮播
Can I learn PLC at the age of 33
C#/. Net phase VI 01C Foundation_ 01: running environment, process of creating new C program, strict case sensitivity, meaning of class library
MapReduce instance (IX): reduce end join
Mapreduce实例(七):单表join
Nc17 longest palindrome substring
Elk project monitoring platform deployment + deployment of detailed use (II)
Une grande vague d'attaques à la source ouverte
随机推荐
在CANoe中通过Panel面板控制Test Module 运行(高级)
《ASP.NET Core 6框架揭秘》样章发布[200页/5章]
[one click] it only takes 30s to build a blog with one click - QT graphical tool
DCDC power ripple test
Tianmu MVC audit I
零基础学习单片机切记这四点要求,少走弯路
【深度学习】语义分割:论文阅读:(CVPR 2022) MPViT(CNN+Transformer):用于密集预测的多路径视觉Transformer
硬件工程师的真实前途我说出来可能你们不信
Interview shock 62: what are the precautions for group by?
Hugo blog graphical writing tool -- QT practice
Leetcode:608 树节点
112 pages of mathematical knowledge sorting! Machine learning - a review of fundamentals of mathematics pptx
[NLP] bert4vec: a sentence vector generation tool based on pre training
CAPL脚本中关于相对路径/绝对路径操作的几个傻傻分不清的内置函数
英雄联盟轮播图手动轮播
MapReduce instance (VI): inverted index
Can I learn PLC at the age of 33
CAP理论
Tianmu MVC audit II
Leetcode:608 tree node