根据给定的信息,我们可以分析出该段代码主要涉及对 GTBL 文件进行读取与处理的操作。这段代码展示了如何从文件中读取特定的数据结构,并对其进行转换以适应特定的数据格式需求。接下来,我们将深入探讨其中涉及的关键知识点。 ### 1. 字节序转换函数 在程序的开始部分,定义了两个用于字节序转换的函数:`int daoxu2(short temp)` 和 `unsigned int daoxu4(unsigned int aa)`。这两个函数的作用是将输入值从一种字节序转换到另一种字节序(通常是从小端序转换为大端序或反之)。 #### `int daoxu2(short temp)` 此函数接收一个 `short` 类型的参数 `temp`,并将其高字节和低字节互换,返回互换后的结果。 ```c int daoxu2(short temp) { temp = temp >> 8 | temp << 8; return temp; } ``` #### `unsigned int daoxu4(unsigned int aa)` 此函数接收一个 `unsigned int` 类型的参数 `aa`,并对其四个字节进行互换操作,以实现字节序的转换。 ```c unsigned int daoxu4(unsigned int aa) { aa = ((aa & 0x000000ff) << 24) | ((aa & 0x0000ff00) << 8) | ((aa & 0x00ff0000) >> 8) | ((aa & 0xff000000) >> 24); return aa; } ``` ### 2. 文件读取函数 `OpenFile` `OpenFile` 函数负责从文件中读取数据,并填充到 `link` 结构体中。此函数接收三个参数:文件指针 `fp`、指向 `link` 结构体的指针 `road` 以及文件中的位置偏移量 `length`。 ```c link* OpenFile(FILE* fp, link* road, unsigned int length) { //... return road; } ``` 在此函数中,通过调用 `fseek` 将文件指针移动到指定位置 `length`,然后依次读取文件中的数据,并进行相应的处理: - 读取两个字节,并使用 `daoxu2` 进行字节序转换,将结果赋值给 `road->len`。 - 读取四个字节,并使用 `daoxu4` 进行字节序转换,将结果赋值给 `road->linkid`。 - 再次读取两个字节,并使用 `daoxu2` 转换后赋值给 `road->namesize`。 - 根据后续逻辑,解析其他字段,如 `dispclass`、`bruch`、`roadnameflag` 和 `Reserved`。 - 如果 `road->roadnameflag` 的值为 `1`,则读取名称数据,并分配内存存储。 ### 3. 主函数 `main` 主函数实现了以下功能: - 打开源文件 `FILENAME1` 用于读取,并检查打开是否成功。 - 求取文件长度,并初始化变量。 - 使用循环逐个读取文件中的记录,并将其存储在数组 `GlobalB` 和 `GlobalA` 中。 - 对数组 `GlobalA` 和 `GlobalB` 进行排序,并输出排序后的时间消耗。 - 打开目标文件 `FILENAME2` 用于写入,并检查打开是否成功。 - 重新初始化并读取数据,写入目标文件。 以上就是基于给定文件描述的关键知识点总结。通过对这些知识点的理解,可以更好地掌握如何处理 GTBL 文件,以及相关的文件读取与字节序转换技巧。
int daoxu2(short temp)
{
temp=temp>>8|temp<<8;
return temp;
}
unsigned int daoxu4(unsigned int aa)
{
aa=((aa&0x000000ff)<<24)|((aa&0x0000ff00)<<8)|((aa&0x00ff0000)>>8)|((aa&0xff000000)>>24);
return aa;
}
link* OpenFile(FILE *fp,link *road,unsigned int length)
{
int temp1,aa;
short temp;
fseek(fp,length,SEEK_SET);
fread(&temp,2,1,fp);
road->len=daoxu2(temp);//信息长度
fread(&temp1,4,1,fp);
road->linkid=daoxu4(temp1);//道路编号
fread(&temp,2,1,fp);
road->namesize=daoxu2(temp);
//if(road->namesize==0xffffffff)
// road->namesize=0; //道路名称的长度
fread(&temp1,4,1,fp);
temp1=daoxu4(temp1);
aa=temp1;
road->dispclass=temp1;//道路番号
aa=aa>>4;
temp1=aa&0x7;
road->bruch=temp1;//岔路数
aa=aa>>3;
temp1=aa&0x1;
road->roadnameflag=temp1;//道路名称长度
aa=(aa>>1)&0xffffff;
road->Reserved=aa;//道路保留信息
if ((road->roadnameflag)==1)
{
road->roadtname=(char *)malloc(road->len-12);
fread(road->roadtname,1,road->len-12,fp);//道路名称
}
else
{
road->roadtname=NULL;
}
return road;
}
#include "头文件.h"
#include "排序.c"
#include "读文件.c"
#include "查找.c"
int main()
剩余5页未读,继续阅读
- mslVictor2014-04-07不能运行,修改了一下还是有问题
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python机器学习基础、Pandas的应用、Tensorflow实战
- c#代码介绍23种设计模式-22访问者模式(附代码)
- 拉丁美洲电动汽车发展与电网的影响.pdf
- 基于ROS系统的视觉处理流程及其二次开发指南
- MATLAB环境下一种基于改进字典学习的旋转机械故障诊断方法 程序运行环境为MATLAB R2018A,执行基于改进字典学习的旋
- 交换机的自动化检测配置要点2
- 哈希表(11).zip
- Python100道题(100).zip
- 基于stm32的通信系统,sim800c与服务器通信,无线通信监测,远程定位,服务器通信系统,gps,sim800c,心率,温度
- cmake-3.30.1-windows-arm64.msi win11 on arm 通过cmake编译&运行C++代码