在C语言中如果将文件中的大量数据存入数组并按降序排序后输出

实现项目:就业行业和人数见文件“employ-data.txt”,请用排序算法对娄据进行降序排序(不允许直接调用系统函数完成排序),在屏幕上显示排序后的数据结果(包括行业及人数),同时将排序结果写入“employ-sort.txt”文件;然后输入要查询的“行业名称”,如果查询成功,则显示查询到的“就业人数”,否则显示“查询不成功”,直到查询者想退出查询,程序结束。

https://ask.csdn.net/questions/7591810?answer=53620692&spm=1001.2014.3001.5504

strcmp没有定义 有没有人告诉我一下在哪定义啊 运行结果及报错内容

回答:添加头文件 <string.h> 即可;参考文章:https://www.runoob.com/cprogramming/c-function-strcmp.html

加上strcmp函数的头文件<string.h>即可解决报错,原代码修改如下:

#include <string.h> 
#include<stdio.h>
#include<stdlib.h>
struct stu{//定义行业信息结构体
    char name[200];//行业名称 
    int num;//人数 
};
int main(int argc,char *argv[]){
    FILE *fp,*fq;//读文件指针fp和创建文件指针fq
    struct stu *p,t;//结构体指针p和变量t
    int i,j,k,n;
    char ch;
    fq=fopen("employ-sort.txt","w");//创建一个排序之后的写文件employ-sort.txt
    //打开读文件employ-data.txt并判断读写文件是否打开成功
    if(!fq || (fp=fopen("employ-data.txt","r"))==NULL){
        printf("Open the file failure, exit...\n");//不成功则提示并退出
        return 0;
    }
    //检测一下文件中存储了多少个行业信息并记入变量n
//    for(n=0;fscanf(fp,"%s%d\n",t.name,&t.num),!feof(fp);n++);
   // for(n=0;,!feof(fp);n++);
    n=0;
    int r = fscanf(fp,"%s%d\n",t.name,&t.num);
   // int end = 0;
    while(feof(fp)==0){
        n++;   
        fscanf(fp,"%s%d%c",t.name,&t.num,&ch);       
    }
//    printf("n=%d\n",n) ;
    
    if((p=(struct stu *)malloc(sizeof(t)*n))==NULL){//按n大小动态申请内存空间
        printf("Application memory failure, exit...\n");//申请失败则提示退出
        return 0;
    }
    rewind(fp);//读文件指针恢复到文件开头
    for(i=0;i<n;i++){//读取n个行业信息并依次存入动态数组中
        fscanf(fp,"%s%d\n",p[i].name,&p[i].num);
      //  printf("p[%d].name=%s,p[%d].num=%d\n",i,p[i].name,i,p[i].num);
        
    }
    fclose(fp);//读取完毕关闭文件
    
    
    for(i=0;i<n;i++){//对n个行业按人数降序排序并输出到文件及屏幕
        for(j=i+1;j<n;j++)
           if(p[i].num<p[j].num){
//                 k=j;
//                if(i!=k)
//                    t=p[k],p[k]=p[i],p[i]=t;
                t.num=p[i].num;
                strcpy(t.name,p[i].name);
                
                p[i].num =p[j].num;
                strcpy(p[i].name,p[j].name);
                
                p[j].num = t.num;
                strcpy(p[j].name,t.name);
//                p[i]=p[j];
//                p[j]=t;
                    //输出到文件
               
                //输出到屏幕
                //printf("%s\t%d\n",p[i].name,p[i].num);
            } 
        //fprintf(fq,"%s     %d\n",p[i].name,p[i].num);
               
    }   
    
    
    printf("排序后,数组内容为;\n");
    for(i=0;i<n;i++){//读取n个行业信息并依次存入动态数组中
       // fscanf(fp,"%s%d\n",p[i].name,&p[i].num);
        printf("%s %d\n",p[i].name,p[i].num);
        fprintf(fq,"%s     %d\n",p[i].name,p[i].num);
        
    }
   // free(p);//释放所申请的内在空间
    fclose(fq);//关闭写文件
    

    //查询行业信息 
    while(1){  
        char name2[200];  //要输入查询的变量 
        int index=-1;     //定义一个不存在的下标,查询到了就改变它的值 
        printf("请输入要查询的行业名称:");  
        scanf("%s",name2); 
    //    printf("name2=%s\n",name2); 
        getchar();  
        int i;  
        for (i=0;i<n;i++){  
        //    printf("p[%d].name=%s,name2=%s\n",i,p[i].name,name2);
            if(strcmp(p[i].name,name2)==0){//比较输入的名称和文件中的名称  
                index=i;    // 匹配相同就返回对应下标 
                break;
               }     
        }
       // printf("index=%d\n",index);
        if(index!=-1){//下标不等于-1则说明匹配成功,打印出人数 
            printf("查询到的就业人数为: %d\n",p[index].num);
        }else
            printf("查询不成功\n");
        printf("是否继续查询?(y/n)");  
        if (getchar()=='n'){  
            break;  
        }  
    } 
    
    free(p);//释放所申请的内在空间
    return 0;
}
//冒昧问一下,你是不是长江师范的

employ-data.txt (测试文件内容,最后一行有个换行)

软件工程 12000000
建筑业 5000000
旅游 6000000



img