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();
}