联合体(共用体)
//联合体(共用体)
//不同类型的变量共同占用一段内存(相互覆盖),联合变量任何时刻只有一个成员存在,节省内存
//联合体变量的大小=最大的成员所占的字节数
//比喻:同穿一条裤子
#include <stdio.h>
#include <stdlib.h>
union MyValue{
int x;
int y;
double z;
};
void main(){
union MyValue d1;
d1.x = 10;
d1.y = 90;
/*最后一次赋值有效 ??? 为什么我这里必须药用这种注释才可以 双斜杠 会提示未闭合*/
/*d1.z = 23.8;*/
printf("d1.x = %d\n,d1.y = %d\n,d1.z = %lf\n", d1.x, d1.y, d1.z);
system("pause");
}
联合体有什么好处? 因为联合体包含很多种类型 当传递参数的时候不确定的情况下可以使用联合体,只要是在联合体内的都行. PS 有点像java的泛型
举例: jni的源码里面也有这个联合体 可以参考下
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,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
void main(){
//枚举的值,必须是括号中的值//
enum Day d = Monday;
printf("%#x,%d\n", &d, d);
getchar();
}
文件 IO流操作
文件的读取 (文本)
#define _CRT_SECURE_NO_WARNINGS
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
//注意这里的宏定义 没有会报错
////读取文本文件
void main(){
char *path = "E:\\code\\testIO.txt";
//打开
FILE *fp = fopen(path, "r");
if (fp == NULL){
printf("文件打开失败..");
return;
}
//读取
char buffer[50];//缓冲
while ((fgets(buffer, 50, fp))){
printf("%s", buffer);
}
//关闭
fclose(fp);
system("pause");
}
结果图
文件的写入
//写入文本文件
void main(){
char *path = "E:\\code\\testIO_new.txt";
//打开
FILE *fp = fopen(path, "w");
char *text = "sadfasdf这是新写入的数据 测试下开口";
fputs(text, fp);
//关闭流
fclose(fp);
system("pause");
}
下面是效果图
文件的复制
//文件的复制(使用二进制的方式)
void main(){
char *read_path = "E:\\code\\cat.jpg";
char *write_path = "E:\\code\\cat_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);
system("pause");
}
结果图
获取文件的大小
void main(){
char *read_path = "E:\\code\\cat.jpg";
FILE *fp = fopen(read_path, "r");
//重新定位文件指针
//SEEK_END文件末尾,0偏移量
fseek(fp, 0, SEEK_END);
//返回当前的文件指针,相对于文件开头的位移量
long filesize = ftell(fp);
printf("%d\n", filesize);
getchar();
}
结果图
/*
“rt” 只读打开一个文本文件,只允许读数据
“wt” 只写打开或建立一个文本文件,只允许写数据
“at” 追加打开一个文本文件,并在文件末尾写数据
“rb” 只读打开一个二进制文件,只允许读数据
“wb” 只写打开或建立一个二进制文件,只允许写数据
“ab” 追加打开一个二进制文件,并在文件末尾写数据
“rt+” 读写打开一个文本文件,允许读和写
“wt+” 读写打开或建立一个文本文件,允许读写
“at+” 读写打开一个文本文件,允许读,或在文件末追加数据
“rb+” 读写打开一个二进制文件,允许读和写
“wb+” 读写打开或建立一个二进制文件,允许读和写
“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
*/
练习: 文本文件加解密
//异或
//规则:1^1=0, 0^0=0, 1^0=1, 0^1=1 同为0,不同为1
//加密
//异或
//规则:1^1=0, 0^0=0, 1^0=1, 0^1=1 同为0,不同为1
//加密
void crpypt(char normal_path[],char crypt_path[]){
//打开文件
FILE *normal_fp = fopen(normal_path, "r");
FILE *crypt_fp = fopen(crypt_path, "w");
//一次读取一个字符
int ch;
while ((ch = fgetc(normal_fp)) != EOF){ //End of File
//写入(异或运算)
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){ //End of File
//写入(异或运算)
fputc(ch ^ 9, crypt_fp);
}
//关闭
fclose(crypt_fp);
fclose(normal_fp);
}
== 主函数调用—-
void main(){
char *normal_path = "E:\\dongnao\\vip\\ndk\\08_08_C_05\\files\\friends.txt";
char *crypt_path = "E:\\dongnao\\vip\\ndk\\08_08_C_05\\files\\friends_crypt.txt";
char *decrypt_path = "E:\\dongnao\\vip\\ndk\\08_08_C_05\\files\\friends_decrypt.txt";
//crpypt(normal_path, crypt_path);
//解密
decrpypt(crypt_path, decrypt_path);
getchar();
}
调用加密结果
调用解密结果
下面是 二进制文件的加密解密(文件 图片 exe程序 都行)
void crypt(char normal_path[], char crypt_path[], char password[]){
//打开文件
FILE *normal_fp = fopen(normal_path, "rb");
FILE *crypt_fp = fopen(crypt_path, "wb");
//一次读取一个字符
int ch;
int i = 0; //循环使用密码中的字母进行异或运算
int pwd_len = strlen(password); //密码的长度
while ((ch = fgetc(normal_fp)) != EOF)
{
fputc(ch ^ password[i % pwd_len], crypt_fp);
i++;
}
fclose(normal_fp);
fclose(crypt_fp);
}
void main(){
char *normal_fp = "E:\\code\\cat_norm.jpg";
char *encryption_fp = "E:\\code\\cat_crypt.jpg";
char *decrpty_fp = "E:\\code\\cat_decrypt.jpg";
//加密
crypt(normal_fp, encryption_fp,"mypassworld");
system("pause");
}
加密结果
解密代码
void crypt(char normal_path[], char crypt_path[], char password[]){
//打开文件
FILE *normal_fp = fopen(normal_path, "rb");
FILE *crypt_fp = fopen(crypt_path, "wb");
//一次读取一个字符
int ch;
int i = 0; //循环使用密码中的字母进行异或运算
int pwd_len = strlen(password); //密码的长度
while ((ch = fgetc(normal_fp)) != EOF)
{
fputc(ch ^ password[i % pwd_len], crypt_fp);
i++;
}
fclose(normal_fp);
fclose(crypt_fp);
}
void decrypt(char crypt_path[], char decrypt_path[], char password[]){
//打开文件
FILE *crypt_fp = fopen(crypt_path, "rb");
FILE *decrypt_fp = fopen(decrypt_path, "wb");
//一次读取一个字符
int ch;
int i = 0; //循环使用密码中的字母进行异或运算
int pwd_len = strlen(password); //密码的长度
while ((ch = fgetc(crypt_fp)) != EOF)
{
fputc(ch ^ password[i % pwd_len], decrypt_fp);
i++;
}
fclose(crypt_fp);
fclose(decrypt_fp);
}
void main(){
char *normal_fp = "E:\\code\\cat_norm.jpg";
char *encryption_fp = "E:\\code\\cat_crypt.jpg";
char *decrpty_fp = "E:\\code\\cat_decrypt.jpg";
//加密
//crypt(normal_fp, encryption_fp, "mypassworld");
//解密
decrypt(encryption_fp, decrpty_fp, "mypassworld");
system("pause");
}
解密结果:
练习 文件的分割以及合并
作者:liudao7994 发表于2017/8/29 20:00:59 原文链接
阅读:18 评论:0 查看评论