报告的一个段落,求翻译

C语言的一个段落,想把它翻译一下,看具体的运行步骤,要求每个步骤都要有分析

img

定义文件指针打开一个二进制文件文件,允许读写数据。如果指针为null提示无法打开,然后exit(0)退出程序
然后依次读数据,只要读出来的数据sizeof不为0一直读,每个数据存储在结构体数组a里
然后对数据冒泡排序,如果第j的数据序号比j-1的数据序号小,交换这两个数据
最后for循环输出结构体数组排序之后的数据, 关闭文件

程序想要解决的问题:读取位于D盘下的diannao文件(该文件中以COMP结构体形式存储了序号、电脑品牌等信息),以从小到大的序号顺序输出文件中电脑的相关信息。
具体实现步骤:
1.定义COMP结构体数组a[10],和中间作为转换顺序中介的结构体t。
2.使用while循环,和fread文件读取函数反复读取文件中的数据,直到数组a满或是文件数据读完。
3.使用冒泡排序,以a[i].xuhao进行排序
4.循环输出电脑相关信息。

望采纳。

最全面的解析需要根据具体代码,来注释说明:

void list()  /* 这里定义了一个命名为list的函数,其既不用参数,也没有返回值*/
{
    int i,j,n=0;
    COMP a[10],t; /*这里的COMP应该是一个自定义的类型(可能是结构体),从后面实现看应该是电脑信息的一个结构体*/
    FILE *fp; /* 这里应该是前面引入文件操作相关的库,需要用到文件操作,所以引入了FILE类型指针 */
    system("cls"); /*这个是系统命令的调用,应该是引入stdlib库后才能支持,而且cls表明是在windows的命令行窗口或者说dos程序控制台环境,是清屏命令*/
    if( (fp=fopen("d:\\dianano","rb"))==NULL)  /*这里尝试用只读二进制格式打开文件 "d:\\dianano"*/
    { printf("无法打开,请检查是否操作正确\n");exit(0);} /*打开不成功就提示并退出程序,这之下的则是打开文件成功才能执行的部门*/
    while( freed(&a[n],sizeof(COMP),1,fp)!=0) /*这里和下面的n++一起配合就是一个完整的循环处理过程,就是1次读取一个COMP类型的数据给数组a对应的元素,不过这样的写法有很多问题,其一n++和while并行啦,编码时容易出错,其实这还不是最严重的,其二,如果文件中数据过多,会造成读取文件时指针越界写入的问题,毕竟a数组声明时只有10个元素大小,而现在并没有体现这样的使用限制*/
    n++;
    for(i=0;i<n-1;i++) /*这行和下行一起构成了一个两层的循环,不过编码很不规范,很容易出错,建议还是用{}来扩起来对应的具体循环执行部分,否则很容易出错*/
    for(j=n-1;j>i;j--)
    if(a[j].xuhao<a[j-1].xuhao) /*这个就是判断比较COMP的xuhao子元素关系,如果a[j]对应的小于a[j-1]对应的,就交换a[j]和a[j-1]。 这和循环配合,就是一个冒泡排序的过程*/
    {t=a[j];a[j]=a[j-1];a[j-1]=t;}
    printf("\n\n\t按序号排列的结果如下:\n"); /*输出一个提示语句*/
    printf("\n\n\n\t序号\t电脑品牌\t电脑型号\t显卡\t\tCPU\t\t内存容量(G)\t价格\n\n"); /*输出表头部分,其中\t是制表符*/
    for(i=0;i<n;i++) /*这行和下行一起构成循环来依次输出具体每行的数据,还是老的编码格式不规范的问题*/
    printf("\t%d\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n\n",a[i].xuhao,a[i].dnpp,a[i].dnxh,a[i].xk,a[i].cpu,a[i].nc,a[i].jiage);
    fclose(fp);/*关闭打开的文件,不过现在关闭其实是有点迟的,应该在读完了马上关闭更好*/
    system("pause");/*又是调用系统命令,就是暂停执行,等待用户键入任意键就退出当前函数执行,这样方便观看输出结果*/
}

总的来是,是一个很小的功能实现,不过还是有很多问题:

  1. 编码规范性问题,有些语句强制写到一行,有些该用{}括起来又没有,这样的编码习惯很容易引发错误,不能很好体现逻辑意图。
  2. 内存越界写入的隐患,具体注释中已经说明,这里不再累述。
  3. 文件关闭时机把握问题,在具体注释中也提到啦,应该一读完就关闭,即在
    while( freed(&a[n],sizeof(COMP),1,fp)!=0)
    n++;
    
    之后就关闭。