当前位置:网站首页>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 运行(高级)
- Defensive C language programming in embedded development
- 大学想要选择学习自动化专业,可以看什么书去提前了解?
- Several silly built-in functions about relative path / absolute path operation in CAPL script
- Release of the sample chapter of "uncover the secrets of asp.net core 6 framework" [200 pages /5 chapters]
- Processes of libuv
- There are software load balancing and hardware load balancing. Which one to choose?
- Function description of shell command parser
- [one click] it only takes 30s to build a blog with one click - QT graphical tool
- The real future of hardware engineers may not be believed by you if I say so
猜你喜欢

What you have to know about network IO model

CAPL 脚本对.ini 配置文件的高阶操作

Mapreduce实例(六):倒排索引

Contrôle de l'exécution du module d'essai par panneau dans Canoe (primaire)

【深度学习】语义分割-源代码汇总

DCDC power ripple test

The replay block of canoe still needs to be combined with CAPL script to make it clear

O & M, let go of monitoring - let go of yourself

112 pages of mathematical knowledge sorting! Machine learning - a review of fundamentals of mathematics pptx

CAPL 脚本打印函数 write ,writeEx ,writeLineEx ,writeToLog ,writeToLogEx ,writeDbgLevel 你真的分的清楚什么情况下用哪个吗?
随机推荐
嵌入式開發中的防禦性C語言編程
June brush question 02 - string
CAPL 脚本打印函数 write ,writeEx ,writeLineEx ,writeToLog ,writeToLogEx ,writeDbgLevel 你真的分的清楚什么情况下用哪个吗?
Regular expressions are actually very simple
零基础学习单片机切记这四点要求,少走弯路
Processes of libuv
One article read, DDD landing database design practice
Canoe cannot automatically identify serial port number? Then encapsulate a DLL so that it must work
C#/. Net phase VI 01C Foundation_ 01: running environment, process of creating new C program, strict case sensitivity, meaning of class library
018.有效的回文
MapReduce instance (V): secondary sorting
51单片机进修的一些感悟
MapReduce工作机制
CANoe下载地址以及CAN Demo 16的下载与激活,并附录所有CANoe软件版本
Une grande vague d'attaques à la source ouverte
五月刷题27——图
英雄联盟轮播图手动轮播
Selection of software load balancing and hardware load balancing
[deep learning] semantic segmentation: paper reading: (2021-12) mask2former
[CV] target detection: derivation of common terms and map evaluation indicators