范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C语言结构体嵌套二级指针和文件读写相关函数

  1.结构体嵌套二级指针#define _CRT_SECURE_NO_WARNINGS #include #include #include #include   struct Teacher {     char* name;     char** Stduents; };  static void allocateSpace(struct Teacher***teachers) { 	struct Teacher** pArray = malloc(sizeof(struct Teacher) * 3);      for (int i = 0; i < 3; i++)     {         //给每个老师分配空间         pArray[i] = malloc(sizeof(struct Teacher));          //给每个老师姓名分配空间         pArray[i]->name = malloc(sizeof(char) * 64);         sprintf(pArray[i]->name, "Teacher_%d", i + 1);          //给老师带的学生的数组分配空间         pArray[i]->Stduents = malloc(sizeof(char*) * 4);          //给四个学生分配内存,并且赋值         for (int j = 0; j < 4; j++)         {             pArray[i]->Stduents[j] = malloc(sizeof(char) * 64);             sprintf(pArray[i]->Stduents[j], "%s_Student_%d", pArray[i]->name, j + 1);         }     }         *teachers = pArray; }  void showArray(struct Teacher** pArray, int len) {     for (int i = 0; i < len; i++)     {         printf("%s ", pArray[i]->name);         for (int j = 0; j < 4; j++)         {             printf("     %s ", pArray[i]->Stduents[j]);         }     } }  static void freeSpace(struct Teacher**pArray,int len) {     for (int i = 0; i < len; i++)     {         //释放老师姓名         if (pArray[i]->name != NULL)         {             free(pArray[i]->name);             pArray[i]->name = NULL;         }          //释放每个学生         for (int j = 0; j < len; j++)         { 			if (pArray[i]->Stduents[j] != NULL) 			{                 free(pArray[i]->Stduents[j]);                 pArray[i]->Stduents = NULL; 			}         }          //释放学生数组         free(pArray[i]->Stduents);         pArray[i]->Stduents = NULL;          //释放老师         free(pArray[i]);         pArray[i] = NULL;     }     //释放老师数组     free(pArray);     pArray = NULL; }  static void test01() {     struct Teacher** pArray = NULL;     //分配内存     allocateSpace(&pArray);      //打印数组     showArray(pArray, 3);      //释放内存     freeSpace(pArray, 3);     pArray = NULL; }   int main01() {     test01();      return 0; }  /*   打印结果 Teacher_1      Teacher_1_Student_1      Teacher_1_Student_2      Teacher_1_Student_3      Teacher_1_Student_4 Teacher_2      Teacher_2_Student_1      Teacher_2_Student_2      Teacher_2_Student_3      Teacher_2_Student_4 Teacher_3      Teacher_3_Student_1      Teacher_3_Student_2      Teacher_3_Student_3      Teacher_3_Student_4 */
  2.结构体偏移量#define _CRT_SECURE_NO_WARNINGS #include #include #include #include   struct person {     char a;//0~3     int b;//4~7 };  static void test01() {     struct person p1;     struct person* p = &p1;      printf("b的偏移量为:%d ", (int)&(p->b) - (int)p);     printf("b的偏移量为:%d ", offsetof(struct person, b)); }  //通过偏移量获取数据 static void test02() {     struct person p1 = { "a",10 };      printf("p.b=%d ", *(int*)((char*)&p1 + offsetof(struct person, b)));      printf("p.b=%d ", *(int*)((int*)&p1 + 1)); }  //结构体嵌套结构体 struct person2 {     char a;     int b;     struct person c; };  static void test03() {     struct person2 p = { "a",10,"b",20 };           int offset1 = offsetof(struct person2, c);     int offset2 = offsetof(struct person, b);      printf("%d ", *(int*)((char*)&p + offset1 + offset2));//10      printf("%d ", ((struct person*) ((char*)&p + offset1))->b);//10 }  int main02() {     //test01();     test02();      return 0; }
  3.内存的对齐方式#define _CRT_SECURE_NO_WARNINGS #include #include #include #include   //#pragma pack(1)  对齐模式修改为1 #pragma pack(show)//默认对齐模数为8  该值可以改为2的n次方   //对于自定义数据类型 内存的对齐规则: /* 1、从第一个属性开始 偏移为0 2、第二个属性开始,地址要放在该类型的整数倍, 与对齐模数比 取小的值 的整数倍上。 3、所有的属性都计算结束后,整体做二次对齐, 整体需放在属性中最大类型与对齐模数比取小的值的整数倍上。 */ typedef struct _STUDENT {     int a;     char b;     double c;     float d; }Student static void test01() {     printf("sizeof=%d ", sizeof(Student));//24 } //结构体嵌套结构体时,只需看子结构体中最大数据类型即可 typedef struct _STUDENT2 {     char a;//0~7     Student b;//8~31  子结构体最大数据类型是8     double c;//32~39 }Student2; static void test02() {     printf("sizeof=%d ", sizeof(Student2)); } int main03() {     //test01();     test02();     return 0; }
  4.文件的读写
  fgetc、fputc、fgets、fputs、fread、fwrite、fprintf、fscanf等函数的使用#define _CRT_SECURE_NO_WARNINGS #include #include #include #include  //1、字符的读写回顾 fgetc()、fputc() static void test01() {     //写文件  fputc     FILE* f_write = fopen("f:/a.txt", "w");      if (f_write == NULL)     {         return;     }     char buf[] = "hello world";     for (int i = 0; i < strlen(buf); i++)     {         fputc(buf[i], f_write);     }     fclose(f_write);      //读文件  fgetc     FILE* f_read = fopen("f:/a.txt", "r");      if (f_read == NULL)     {         return;     }     char ch;     while ((ch = fgetc(f_read) != EOF))//EOF即  END  OF  FILE     {         printf("%c ", ch);     }          fclose(f_read); }  //2、按行读写文件 static void test02() {     //写文件  fputs()     FILE* f_write = fopen("f:/a.txt", "w+");     if (f_write == NULL)     {         return;     }     char* buf[] =     {           "君不见黄河之水天上来,奔流到海不复回 "          "君不见高堂明镜悲白发,朝如青丝暮成雪 "          "人生得意须尽欢,莫使金樽空对月 "          "天生我材必有用,千金散尽还复来 "     };      for (int i = 0; i < 4; i++)     {         fputs(buf[i], f_write);     }     fclose(f_write);          //读文件  fgets()     FILE* f_read = fopen("f:/a.txt", "r");     if (f_read == NULL)     {         return;     }     while (!feof(f_read))     {         char temp[1024] = { 0 };          fgets(temp, 1024, f_read);          printf("%s ", temp);     }     fclose(f_read); }  //3、按块进行读写 fread()、fwrite() struct hero {     char name[64];     int age; };  static void test03() {     //写文件  fwrite()     FILE* f_write = fopen("f:/a.txt", "wb");     if (f_write == NULL)     {         return;     }     struct hero heros[] =     {         {"孙悟空",111},         {"曹操",222},         {"赵云",333},         {"鲁班",444},     };      for(int i=0;i<4;i++)     {         fwrite(&heros[i], sizeof(struct hero), 1, f_write);     }     fclose(f_write);      //读文件  fread()     FILE* f_read = fopen("f:/a.txt", "rb");     if (f_read == NULL)     {         return;     }      struct hero temp[4];     fread(&temp, sizeof(struct hero), 4, f_read);     for (int i = 0; i < 4; i++)     {         printf("姓名:%s  年龄:%d ", temp[i].name, temp[i].age);     }     fclose(f_read); }  //4、格式化读写 static void test04() {     //写文件  fprintf()     FILE* f_write = fopen("f:/a.txt", "w");     if (f_write = NULL)     {         return;     }     fprintf(f_write, "hello world %s", "abcd");     fclose(f_write);      //读文件 fscanf()     FILE* f_read = fopen("f:/a.txt", "r");     if (f_read = NULL)     {         return;     }     char temp[1024] = { 0 };     while (!feof(f_read))     {         fscanf(f_read, "%s", temp);         printf("%s ", temp);     }      fclose(f_read); }  static void test05() {     //写文件     FILE* f_write = fopen("f:/a.txt", "wb");     if (f_write == NULL)     {         return;     }     struct hero heros[] =     {         {"孙悟空",111},         {"曹操",222},         {"赵云",333},         {"鲁班",444},     };      for (int i = 0; i < 4; i++)     {         fwrite(&heros[i], sizeof(struct hero), 1, f_write);     }     fclose(f_write);      //读文件     FILE* f_read = fopen("f:/a.txt", "rb");     if (f_read == NULL)     {         //error 宏         //printf("文件加载失败 ");         perror("文件加载失败");//用户提示信息+系统提供信息         return;     }     struct hero temphero;     //移动光标     //fseek(f_read, sizeof(struct hero) * 3, SEEK_SET);     fseek(f_read, -(long)sizeof(struct hero) * 1, SEEK_END);//sizeof的返回值是无符号的 需强转为long类型     rewind(f_read);//将光标置到文件开头     fread(&temphero, sizeof(struct hero), 1, f_read);     printf("姓名:%s,年龄:%d ", temphero.name, temphero.age);//鲁班 444     fclose(f_read); } int main04() {     //test01();     //test02();     //test03();     //test04();     test05();     return 0; }
  5.文件读写的注意事项#define _CRT_SECURE_NO_WARNINGS #include #include #include #include  static void test01() {     FILE* file = fopen("f:/a.txt", "r");      if (file == NULL)     {         return;     }     char ch;  #if 0     while (!feof(file))     {         ch = fgetc(file);          //滞后性         if (feof(file))         {             break;         }         printf("%c", ch);     } #endif     char ch;     while ((ch = fgetc(file)) != EOF)     {         printf("%c", ch);     }     fclose(file); } //注意事项2 struct person {     char* name;//不要将指针写入到文件中     int age; }; int main05() {     test01();     return 0; }
  6.配置文件的读写#pragma  once #define _CRT_SECURE_NO_WARNINGS #include #include #include  struct ConfigInfo { 	char key[64]; //索引值 	char value[64]; //实值 };   //获取有效行数 int getFileLine(char* fileName);  //判断当前行是否有效 int isValidLine(char* str);  //解析文件 void parseFile(char* filePath, int lines, struct ConfigInfo** configInfo);  //根据索引值 获取 实值  char* getInfoByKey(char* key, struct ConfigInfo* configInfo, int line);  //释放信息 void freeSpace(struct ConfigInfo* configInfo); #include "config.h"  //获取有效行数 int getFileLine(char* fileName) { 	FILE* file = fopen(fileName, "r"); 	if (file == NULL) 	{ 		return -1; 	}  	char buf[1024] = { 0 }; 	int lines = 0; 	while (fgets(buf, 1024, file) != NULL) 	{ 		//如果是有效行 才统计 		if (isValidLine(buf)) 		{ 			lines++; 		}  	} 	fclose(file);  	return lines; }  //判断当前行是否有效 int isValidLine(char* str) { 	if (str[0] == " " || str[0] == "" || strchr(str, ":") == NULL) 	{ 		return 0; //无效数据 都返回假 	} 	return 1; }   //解析文件 void parseFile(char* filePath, int lines, struct ConfigInfo** configInfo) {  	struct ConfigInfo* info = malloc(sizeof(struct ConfigInfo) * lines);  	if (info == NULL) 	{ 		return; 	}  	FILE* file = fopen(filePath, "r");  	char buf[1024] = { 0 }; 	int index = 0; 	while (fgets(buf, 1024, file) != NULL) 	{ 		//解析数据  有效数据才解析 		// heroName:aaaa  		if (isValidLine(buf)) 		{ 			memset(info[index].key, 0, 64); 			memset(info[index].value, 0, 64);  			char* pos = strchr(buf, ":"); //pos代表冒号所在位置  			strncpy(info[index].key, buf, pos - buf); //将key截取到 结构体中 最后-1的原因是不需要截取换行符 			strncpy(info[index].value, pos + 1, strlen(pos + 1) - 1);  			/*printf("key =  %s ", info[index].key); 			printf("value =  %s", info[index].value);*/ 			index++;  		}  		memset(buf, 0, 1024);  	}   	*configInfo = info; }   //根据索引值 获取 实值  char* getInfoByKey(char* key, struct ConfigInfo* configInfo, int line) { 	for (int i = 0; i < line; i++) 	{ 		if (strcmp(key, configInfo[i].key) == 0) 		{ 			return configInfo[i].value; 		} 	} 	return NULL; }   //释放信息 void freeSpace(struct ConfigInfo* configInfo) { 	if (configInfo != NULL) 	{ 		free(configInfo); 		configInfo = NULL; 	}  }#define _CRT_SECURE_NO_WARNINGS #include #include #include #include "config.h"  struct Person { 	char a; 	int b; };  void test01() { 	char* filePath = "./config.txt";  	int line = getFileLine(filePath);  	printf("文件的有效行数为:%d ", line);  	struct ConfigInfo* pArray = NULL;  	parseFile(filePath, line, &pArray);  	//测试 根据key 访问value 	printf("heroId = %s ", getInfoByKey("heroId", pArray, line)); 	printf("heroName = %s ", getInfoByKey("heroName", pArray, line)); 	printf("heroAtk = %s ", getInfoByKey("heroAtk", pArray, line)); 	printf("heroDef = %s ", getInfoByKey("heroDef", pArray, line)); 	printf("heroInfo = %s ", getInfoByKey("heroInfo", pArray, line));   	//释放内存 	freeSpace(pArray); 	pArray = NULL;   	//文件加密 codeFile( sourceFile ,  destFile ) 	// #  35  转为 short 	// 0000 0000 0010 0011   << 4 	// 0000 0010 0011 0000    	// 1000 0000 0000 0000    |  	// 1000 0010 0011 0000  + 0000 ~ 1111 随机数  rand()%16     0~ 15 	// 1000 0010 0011 1010   	//解密  decodeFile ( sourceFile ,  destFile ) 	// 1000 0010 0011 1010  <<1  	// 000  0010 0011 10100  >> 5 	// 0000 0000  0010 0011 }  int main()  { 	test01(); 	system("pause"); 	return EXIT_SUCCESS; }

法国媒体承认来自北京的竞争和以前不同了,更多涉及创新12月9日,法国世界报网站发表了题为中国与世贸全球化故事的系列文章,文中写到在差不多20年的时间里,中国已经成为世界上最大的商品出口国。该系列文章表达了这样一个观点现在来自北京的竞12月28日白酒医药新能源半导体煤炭军工预测走势看法各位亲爱的朋友们大家好!来看我玫瑰!三大指数上午来看,三大指数,高开低走,震荡下行,其中以创业板表现较为强势。市场行情上午来看行情总体稳定良好,上涨股票家数维持在2000家和下跌股4亿美元的日平均交易量,链游是如何一个月敲开市场大门的?今年5月份后,区块链游戏的爆发点燃市场。和游戏相关的独立活跃钱包数量达到了近76万个。和传统的游戏模式相比,边玩边赚(playtoearn)的游戏模式开启了游戏行业在区块链世界的新微信悄悄上线新功能,这次真的很实用最近事儿哥发现微信又悄悄上线了一个实用的新功能,能够更好的保护你的隐私哦大家可能都有过这样的经历,有时候需要在陌生的电脑上登录自己的微信,来传输文件,传输完后还得记得退出登录,要不CentOSLinux最常用的命令及快捷键整理最近一直在对CentOS系统进行各种体验,为方便自己也方便他人,整理了Linux常用命令及快捷键,不过其实大多和DOS是一样的,只是命令的表达上可能有点儿不一样。常用Linux命令李彦宏中国迎来AI黄金十年,百度大脑日调用量突破1万亿次百度创始人董事长兼首席执行官李彦宏在百度Create2021(百度AI开发者大会)开场演讲中表示,人机共生时代,中国迎来AI黄金十年。未来10年,AI将成为改变世界的有力工具,千行快与靓的交融雷蛇黑寡妇蜘蛛V3Pro大家好,我是波导终结者。前阵子给工作室安排好了4K双显之后,桌面又显得有些挤了,PCNUC笔记本的各种线材来回拔插也是搞得我头都大了。尝试过用小配列的键盘,但遇到需要用数字键的时候网络问题排查IPv6环境下VIP地址不通问题背景IPv6环境下,在浏览器中通过httpvipport访问web业务,提示无法访问此网站,vip的响应时间过长。分析过程之前碰到过多次在PC浏览器上无法访问vip的情况,排查如何评价华为说4G运存已经够用?在大多数人的认知里,手机内存越大越流畅,而现如今4GB内存已经不见得够满足人们的需求了,很多旗舰手机也都有推出6G8G。不过,华为P系列产品COOHW老施对此给出了不同的看法,他认荣耀危险,Redmi也跑不掉,iPhoneSE3说的!国产手机怎么玩?感谢您的阅读。荣耀危险,Redmi也跑不掉,iPhoneSE3说的!国产手机怎么玩?最近网上关于iPhoneSE3的消息不少,除了配置意外,最引人注意的就是价格,根据网上的消息,i华为笔记本会超过联想吗?华为笔记本matebook13matebookxpro已经超越了联想。那个爽劲儿,只有使用过的人才知道!真心佩服华为!事实证明,只要华为想做就没有做不到的。相对于手机超过苹果,电脑
仅售119元,就可以买到媲美官方的MagSafe充电器点击右上角关注我们,每天给您带来最新最潮的科技资讯,让您足不出户也知道科技圈大事!从去年iPhone12发布之后,就骂声不断,什么升级不大啊,又没有高刷电池还这么小,价格还卖那么贵苹果面临1777亿元罚单!一季度在中国营收1147亿元,中国会罚吗?本文原创,请勿抄袭和搬运,违者必究苹果面临千亿罚单苹果拥有庞大的软硬件生态,别的企业可能需要靠销售手机来实现营收,但卖手机只是苹果一部分的营收结构。还有来自于软件服务业务,每年都能五一买什么手机?这4款千元5G手机,物美价廉值得拥有五一长假有的朋友出去旅游,有的朋友在家购物,因为放假期间很多厂商对自己的产品价格下调,还有一些新产品推出,用来吸引消费者。今天我们主要来聊一下五一值得入手的4款千元5G手机,款款均重磅!尽一切努力跟上中国?美国急了推出五项数字美元试点计划FX168财经报社(香港)讯综合金融博客Zerohedge报道,众所周知,目前为止中国在推出CBDC(中央银行数字货币)方面远远领先于其他所有央行,但是美国是尽一切努力跟上。尽管如比尔盖茨1300亿美元资产分布曝光,离婚前是美国最大农田主比尔盖茨3日宣布与妻子梅琳结束27年婚姻,两人育有三名子女,一起缔造1300多亿美元(约合人民币8400亿元)的商业神话,外媒猜测等财产分割之后,盖茨将从全球第4位富豪下滑至第十七每经10点丨盖茨女儿就父母离婚发声全家已历经一段充满挑战的时光世卫本周内完成对两款中国疫苗的评估百度触及回港上市以来低位每经编辑胡玲1丨一季度中国投资者增持11。5吨黄金ETF每经AI快讯,5月4日,中国黄金协会日前发布数据,今年一季度,国内黄金交易型开放式指数基金(黄金ETF)规模继续增长,共增持比尔盖茨夫妇宣布离婚,8482亿元财富如何分?出品搜狐科技编辑梁昌均5月4日消息,65岁的微软公司联合创始人比尔盖茨和56岁的梅琳达盖茨宣布离婚,结束27年的婚姻。双方在各自的推特发布了同一份声明,并且都关闭了评论。声明中说经比尔盖茨官宣离婚!由妻子提出!有3大看点5月4日消息,比尔盖茨在社交媒体上发布了他和梅琳达盖茨的离婚声明,决定结束婚姻关系,但他们还将继续在基金会一起工作。本次热点事件有三大看点1。两人没有婚前协议!财产如何分?盖茨结婚比尔盖茨突然离婚!理由清新脱俗,或涉8000亿财产分割不是小三,不是互相厌倦,是无法继续共同进步花朵财经原创微软公司创始人兼亿万富翁比尔盖茨(BillGates)和妻子梅琳达盖茨(MelindaGates)刚刚发布联合声明,宣布两人已唏嘘!比尔盖茨夫妇宣布离婚,1305亿美元财产面临分割黄青春虎嗅APP虎嗅机动资讯组作品作者黄青春题图视觉中国猝不及防。今天(美东时间5月3日),在BBC纽约时报等一众媒体争相报道后,微软创始人比尔盖茨(BillGates)离婚的消息有什么好的手机推荐吗。不要苹果。拍照要好,影音功能牛逼,处理器要最好的,价格无所谓?既然不要苹果,还想要顶级体验,那就只能在安卓旗舰中找了,反正对价格也无所谓,那就挑贵的来!第一款三星S21Ultra这是公认的安卓机皇,虽然今年不是那么给力,但在产品力上,三星是最