C语言基础知识总结(三)

1、联合体(共用体)

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

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,%lf\n",d1.x,d1.y,d1.z);
	system("pause");
}
typedef union jvalue {
	jboolean    z;
	jbyte       b;
	jchar       c;
	jshort      s;
	jint        i;
	jlong       j;
	jfloat      f;
	jdouble     d;
	jobject     l;
} jvalue;

 

 2、枚举

限定值,保证取值的安全性 

enum Day
{
	Monday,
	Tuesday,
	Wednesday,
	Thursday,
	Friday,
	Saturday,
	Sunday
};

void main(){
	//枚举的值,必须是括号中的值
	enum Day d = Monday;
	printf("%#x,%d\n",&d,d);
	
    //内存地址不是连续的
    /*
	int i = 0;
	enum Day *p = &d;
	for (; p < &d + 7; p++){
		printf("%#x,%d\n", p, *p);
	}
	*/
    
	getchar();
}

3、IO读写

(1)、读取文本文件

void main(){
	char *path = "E:\\c_work\\Project5\\files\\friends.txt";

	FILE *f = fopen(path, "r");
	if (f==NULL){
		printf("文件打开失败...");
		return;
	}

	char buff[50]; //缓存
	while (fgets(buff,50,f)){
		printf("%s\n", buff);
	};

	fclose(f);

	getchar();
}

 (2)、写入文本

void main(){
	char *path = "E:\\c_work\\Project5\\files\\friends_new.txt";

	FILE *f = fopen(path, "w");
	char *text = "hchmily@sina.com,程华才,学清路 8\n号科技财富中心 A";
	fputs(text, f);

	fclose(f);
	getchar();
}

 (3)、二进制文件

//计算机的文件存储在物理上都是二进制
//文本文件和二进制之分,其实是一个逻辑之分
//C读写文本文件与二进制文件的差别仅仅体现在回车换行符
//写文件时,每遇到一个'\n',会将其转换为'\r\n'(回车换行)
//读文件时,每遇到一个'\r\n',会将其换成'\n';

void main(){
	char *read_path = "E:\\c_work\\Project5\\files\\liuyan.png";
	char *write_path = "E:\\c_work\\Project5\\files\\liuyan_new.png";


	FILE *read_f = fopen(read_path, "rb");
	FILE *write_f = fopen(write_path, "wb");

	int buff[50];
	int len = 0;
	while ((len = fread(buff, sizeof(int), 50, read_f)) != 0){
		fwrite(buff, sizeof(int), 50, write_f);
	}

	fclose(read_f);
	fclose(write_f);
	getchar();
}

获取文件大小

void main(){
	char *read_path = "E:\\c_work\\Project5\\files\\liuyan.png";
	FILE *p = fopen(read_path, "rb");
	//重新定位文件指针
	//SEEK_END文件末尾,0偏移量
	fseek(p, 0, SEEK_END);
	//返回当前的文件指针,相对于文件开头的位移量
	long filesize = ftell(p);
	printf("%d\n", filesize);

	getchar();
}

 文本文件加解密

//异或
//规则1^1=0,0^0=0,1^0=1,0^1=1;同为0,不同为1
void crpypt(char normal_path[],char crypt_path[]){
	//打开文件
	FILE *normal_p = fopen(normal_path,"r");
	FILE *crypt_p = fopen(crypt_path, "w");

	//一次读取一个字符
	int ch;
	while ((ch=fgetc(normal_p))!=EOF){//end of file
		//写入(异或运算)
		fputc(ch ^ 9, crypt_p);
	}

	fclose(normal_p);
	fclose(crypt_p);
}

void decrpypt(char crpypt_path[], char decrpypt_path[]){
	//打开文件
	FILE *crpypt_p = fopen(crpypt_path, "r");
	FILE *decrpypt_p = fopen(decrpypt_path, "w");

	//一次读取一个字符
	int ch;
	while ((ch = fgetc(crpypt_p)) != EOF){//end of file
		//写入(异或运算)
		fputc(ch ^ 9, decrpypt_p);
	}

	fclose(crpypt_p);
	fclose(decrpypt_p);
}

void main(){
	char *normal_path = "E:\\c_work\\Project5\\files\\friends.txt";
	char *crypt_path = "E:\\c_work\\Project5\\files\\friends_crypt.txt";
	char *decrpypt_path = "E:\\c_work\\Project5\\files\\friends_decrpypt.txt";
	//crpypt(normal_path, crypt_path);
	decrpypt(crypt_path, decrpypt_path);

	getchar();
}

二进制文件加密 

//读取二进制文件中的数据时,一个一个字符读取
//密码:iloveyou
void crpypt(char normal_path[], char crypt_path[],char password[]){
	//打开文件
	FILE *normal_p = fopen(normal_path, "rb");
	FILE *crypt_p = fopen(crypt_path, "wb");

	//一次读取一个字符
	int ch;
	int i = 0;
	int pad_len = strlen(password);
	while ((ch = fgetc(normal_p)) != EOF){//end of file
		//写入(异或运算)
		fputc(ch ^ password[i%pad_len], crypt_p);
		i++;
	}

	fclose(normal_p);
	fclose(crypt_p);
}

void decrpypt(char crpypt_path[], char decrpypt_path[], char password[]){
	//打开文件
	FILE *crpypt_p = fopen(crpypt_path, "rb");
	FILE *decrpypt_p = fopen(decrpypt_path, "wb");

	//一次读取一个字符
	int ch;
	int i = 0;
	int pad_len = strlen(password);
	while ((ch = fgetc(crpypt_p)) != EOF){//end of file
		//写入(异或运算)
		fputc(ch ^ password[i%pad_len], decrpypt_p);
		i++;
	}

	fclose(crpypt_p);
	fclose(decrpypt_p);
}

void main(){
	char *normal_path = "E:\\c_work\\Project5\\files\\liuyan.png";
	char *crypt_path = "E:\\c_work\\Project5\\files\\liuyan_crypt.png";
	char *decrpypt_path = "E:\\c_work\\Project5\\files\\liuyan_decrpypt.png";
	
	//crpypt(normal_path, crypt_path,"iloveliuyan");
	decrpypt(crypt_path, decrpypt_path,"iloveliuyan");

	getchar();
}


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值