img src 文件流_文件操作(二)

本文详细介绍了文件的格式化操作,包括fprintf和fscanf的使用,以及文件的随机读写技巧,如如何复位文件流指针、定位文件流以及判断文件末尾。同时,还探讨了文件加密器的基本原理和实现,涉及多个源文件的组织结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件的格式化操作

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 攻击:%dn",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 攻击:%dn", hero[i].name, &hero[i].deff, &hero[i].atk);
 }


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


 fclose(fp);
}

总结:

88f4fa0eb70d32260a1a3e9caa6411df.png

文件的随机读写

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=%sn", 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=%sn", 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=%sn", 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 = %ldn", 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=%ldn", file_len);
 printf("%sn", 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);
}

文件加密器

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值