C语言快速讲解(六)联合体、枚举、IO

时间:2022-06-01 21:31:26

前言:作为一个安卓程序员,如果不懂C/C++开发,那么安卓jni、NDK、视频解码、音频解码也没法开发,有需求我们就要学习,加油吧!今天开始我们快速讲解C语言,有Java基础的人适合看本博客。

--------分割线------

本篇博客代码需要用到的头文件:

#define _CRT_SECURE_NO_WARNINGS
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
---------分割线-----

联合体:联合体又称共同体,不同类型的变量共通占用一段内存(相互覆盖),联合变量任何时刻只有一个成员存在,优点是节省内存,联合体变量的大小=最大的成员所占的字节数。

例子:

union MyValue{
	int x;
	int y;
	double z;
};

void main(){
	union MyValue d1;
	d1.x = 90;
	d1.y = 100;//最后一次赋值有效
	//d1.z = 23.8;
	printf("%d,%d,%d",d1.x,d1.y,d1.z);

	getchar();
}
运行截图:

C语言快速讲解(六)联合体、枚举、IO

和typefef组合:

typedef union jvalue {
jboolean    z;
jbyte       b;
jchar       c;
jshort      s;
jint        i;
jlong       j;
jfloat      f;
jdouble     d;
jobject     l;
} jvalue;
------------分割线--------

枚举:限定值,保证取值的安全性。

举例:

enum Day{
	Monday,
	Tuesday,
	Wendesday,
	Thuresday,
	Saturday,
	Sunday
};

void main(){
	//枚举的时候,必须是括号中的值
	enum Day d = Monday;
	printf("%#x,%d\n",&d,d);

	getchar();
}
运行截图:

C语言快速讲解(六)联合体、枚举、IO

---------分割线-------

IO操作:

读取文本:

void main(){

	//char* path = "E:\\fly\\code2\\files\\friends.txt";
	char* path = "E:\\fly\\code2\\files\\friends_new.txt";
	//打开
	FILE *fp = fopen(path,"r");
	if (fp == NULL){
		printf("文件打开失败!!!");
		return;
	}
	//读取
	char buff[50];//缓冲
	while (fgets(buff, 50, fp)){
		printf("%s",buff);
	}
	//关闭
	fclose(fp);

	getchar();
}
运行截图:

C语言快速讲解(六)联合体、枚举、IO

写入文本:

void main(){
	char* path = "E:\\fly\\code2\\files\\friends_new2.txt";
	//打开
	FILE *fp = fopen(path,"w");
	char *text = "我们是好学生,我们是三好学生\n啦啦啦。";
	//往里面写
	fputs(text,fp);
	//关闭流
	fclose(fp);
	getchar();
}
打开文件夹显示:

C语言快速讲解(六)联合体、枚举、IO
文件复制: 了解文件复制我们先要了解下面几个概念

1.计算机的文件存储在物理上都是二进制

2.文本文件和二进制之分,其实是一个逻辑之分

3.C读写文本文件和二进制文件的差别仅仅体现在回车换行符

4.写文本时,每遇到一个'\n',将会转换成'\r\n'(回车换行),读文本时,每遇到一个'\r\n',会将其转换成'\n'

例子:

void main(){
	char *read_path = "E:\\fly\\code2\\files\\timg.jpg";
	char *write_path = "E:\\fly\\code2\\files\\timg_new.jpg";
	//读的文件 b字符表示操作二进制文件binary
	FILE *read_fp = fopen(read_path,"rb");

	//写的文件
	FILE *write_fp = fopen(write_path,"wb");

	//复制
	int buff[50];//缓冲区域
	int len = 0;//每次读到的数据长度
	while ((len = fread(buff, sizeof(int), 50, read_fp)) != 0){
		//将读到的内容写入新的文件
		fwrite(buff, sizeof(int), len, write_fp);
	}
	//关闭流
	fclose(read_fp);
	fclose(write_fp);
	getchar();
}
打开所在文件夹:

C语言快速讲解(六)联合体、枚举、IO

C语言快速讲解(六)联合体、枚举、IO

--------分割线-------

文本文件加密

规则:异或(1^1 = 0,0^0 = 0;1^0 = 1,0^1 = 1)

demo1:

//加密
void crptpy(char normal_path[], char crypt_path[]){
	//打开文件
	FILE *normal_fp = fopen(normal_path,"r");
	FILE *crypt_fp = fopen(crypt_path, "w");
	//一次读取一个字符
	int ch;
	//EOF:End of file
	while ((ch = fgetc(normal_fp)) != EOF){
		//写入(异或运算)
		fputc(ch ^ 9, crypt_fp);
	}
	//关闭
	fclose(crypt_fp);
	fclose(normal_fp);
}

//解密
void decrpypt(char crypt_path[], char decrypt_path[]){
	//打开文件
	FILE *normal_fp = fopen(crypt_path,"r");
	FILE *crypt_fp = fopen(decrypt_path,"w");
	//一次读一个字符
	int ch;
	while ((ch = fgetc(normal_fp)) != EOF){
		//写入(异或预算)
		fputc(ch ^ 9, crypt_fp);
	}
	//关闭
	fclose(crypt_fp);
	fclose(normal_fp);
}

void main(){
	char *normal_path = "E:\\fly\\code2\\files\\friends.txt";
	char *crypt_path = "E:\\fly\\code2\\files\\friends_crypt.txt";
	char *decrypt_path = "E:\\fly\\code2\\files\\friends_decrypt.txt";
	//加密
	//crptpy(normal_path,crypt_path);
	//解密
	decrpypt(crypt_path,decrypt_path);
	getchar();
}
先加密在解密,运行截图:

C语言快速讲解(六)联合体、枚举、IO

C语言快速讲解(六)联合体、枚举、IO

C语言快速讲解(六)联合体、枚举、IO

demo2:二进制文件加密,读取二进制文件中的数据时一个一个字节读取

//加密
void crypt(char normal_path[], char crpypt_path[], char password[]){
	//打开文件
	FILE *normal_fp = fopen(normal_path,"rb");
	FILE *crpypt_fp = fopen(crpypt_path,"wb");
	//一次读取一个字符
	int ch;
	int i = 0;//循环使用密码中的字母进行异或运算
	int pwd_len = strlen(password);//密码的长度
	while ((ch = fgetc(normal_fp)) != EOF){
		//写入(异或运算)
		fputc(ch^password[i%pwd_len], crpypt_fp);
		i++;
	}
	//关闭
	fclose(normal_fp);
	fclose(crpypt_fp);
}

//解密
void decrypt(char crpypt_path[], char decrpypt_path[], char password[]){
	//打开文件
	FILE *normal_fp = fopen(crpypt_path, "rb");
	FILE *crpypt_fp = fopen(decrpypt_path, "wb");
	//一次读取一个字符
	int ch;
	int i = 0;//循环使用密码中的字母进行异或运算
	int pwd_len = strlen(password);//密码的长度
	while ((ch = fgetc(normal_fp)) != EOF){
		//写入(异或运算)
		fputc(ch^password[i%pwd_len], crpypt_fp);
		i++;
	}
	//关闭
	fclose(normal_fp);
	fclose(crpypt_fp);
}

void main(){
	char *normal_path = "E:\\fly\\code2\\files\\liuyan.png";
	char *crypt_path = "E:\\fly\\code2\\files\\liuyan_crypt.png";
	char *decrypt_path = "E:\\fly\\code2\\files\\liuyan_decrypt.png";
	//加密
	//crypt(normal_path,crypt_path,"hello");
	//解密
	decrypt(crypt_path,decrypt_path,"hello");
}
打开所在的文件夹:(先加密再解密)

C语言快速讲解(六)联合体、枚举、IO

C语言快速讲解(六)联合体、枚举、IO

C语言快速讲解(六)联合体、枚举、IO

-----------完---------