按升序对文本文件进行排序

如何解决按升序对文本文件进行排序

egen.h

typedef struct postTyp
{
    char namn[30];
    char efternamn[30];
    char klubb[30];
}postTyp;

FILE *openfil();

startordning.h

#define MAX_SKIERS 100
typedef struct nummer
{
    int skiers[MAX_SKIERS];
    int pos1;
    int pos2;
    int temp;
}nummer;

FILE *openfil();

tid.h

typedef struct tid
{
    float tid[10];
}tid;

FILE *openfil();

main.c

#include "egen.h"
#include "startordning.h"
#include "tid.h"

void registrera(int x) {
    FILE *fp;
    char filnamn[] = "test.dat";

    postTyp post;
    fp = openfil(filnamn,filnamn,filnamn);  
    if(fp==NULL){
        exit(1);
    }

fseek(fp,SEEK_SET); // går först i filen
fread(&post,sizeof(postTyp),1,fp); // läser av filen
while(!feof(fp)){
fread(&post,fp); //läser av filen om det är sant
x++;
}

while (x < 3) {

    fseek(fp,SEEK_END);
    printf("\nAnge namn: ");
    gets(post.namn);
    printf("Ange efternamn: ");
    gets(post.efternamn);
    printf("Ange klubb: ");
    gets(post.klubb);

fwrite(&post,fp);
fseek(fp,SEEK_SET);
fread(&post,fp);
while(!feof(fp)){
        //printf("\n%s %s %s\n",post.namn,post.efternamn,post.klubb);
fread(&post,fp);
}
x++;
}
fclose(fp);
}

void Copy() {

FILE *fptr1,*fptr2;
    char c;

    // Open one file for reading
    fptr1 = fopen("test.dat","r");
    if (fptr1 == NULL)
    {
        exit(0);
    }

    // Open another file for writing
    fptr2 = fopen("test2.dat","w");
    if (fptr2 == NULL)
    {
        exit(0);
    }

    // Read contents from file
    c = fgetc(fptr1);
    while (c != EOF)
    {
        fputc(c,fptr2);
        c = fgetc(fptr1);
    }

    fclose(fptr1);
    fclose(fptr2);

    //printf("\ncopy succesful\n");
}

void startordning(int x) {

FILE *fp;
    char filnamn[] = "test.dat";
postTyp post;
    fp = openfil(filnamn,filnamn); 
    if(fp==NULL){
        exit(1);
    }

fseek(fp,fp); //läser av filen om det är sant
x++;
}

nummer j;

   srand(time(NULL));
int i;


   for (i = 0; i <= x; i++){
      j.skiers[i] = i;
   }
   for (i = 0; i < x*2; i++) {
      // Generate two random positions
      j.pos1 = rand() % x + 1;
      j.pos2 = rand() % x + 1;

      // Swap the skiers at the two positions
      j.temp = j.skiers[j.pos1];
      j.skiers[j.pos1] = j.skiers[j.pos2];
      j.skiers[j.pos2] = j.temp;
   }

fseek(fp,fp);
i=1;
while(!feof(fp)){
    printf("\n\n%s %s %s %d",post.klubb,j.skiers[i]);
fread(&post,fp);
//printf(" %d",j.skiers[i]);
i++;
}

}

void aktider(int x) {

FILE *fp;
    char filnamn[] = "test2.dat";
postTyp post;
nummer j;
tid w;
    fp = openfil(filnamn,filnamn); 
    if(fp==NULL){
        exit(1);
    }

int i;


fseek(fp,j.skiers[i]);
i++;
x++;
}





 int p = 0;
 int number;

 while(p < 3) {

  printf("\nEnter startnumber on the one you wanna give a time to!\n");
  scanf("%d",&number);

  for (i = 0; i < x + 1; i++) 
  {
    if (j.skiers[i] == number)    /* If required element is found */
    {
      printf("What time do you wanna give the person?\n");
      scanf("%f",&w.tid[i]);
      p++;
      break;
    }
  }
 }

 fseek(fp,fp);
i=1;
while(!feof(fp)){
    printf("\n\n%s %s %s %d %.2f",j.skiers[i],w.tid[i]);
fread(&post,j.skiers[i]);
//printf(" %.2f ",w.tid[i]);
i++;
}

}

int main(int argc,const char* argv[]){
int x = 0;

    registrera(x);
    Copy();
    startordning(x);
    aktider(x);

return 0;

}

FILE *openfil(char namn[],char efternamn[],char klubb[]) {
    FILE *fpLokal;

    if((fpLokal = fopen(namn,"r+b")) == NULL)

    if ((fpLokal = fopen(namn,"w+b")) == NULL) {
        printf("fel\n");
        return NULL;
    }

    return fpLokal;
}

以上是我的代码,它完全可以正常工作。目前正在例如从文本文件中打印此代码

Hanna Svensson FCB 2 35.37
Patrik Svensson FCB 3 56.23
Oscar Svensson FCB 1 30.20

接下来我想做的是对文本文件进行排序,使其像这样打印

Oscar Svensson FCB 1 30.20
Hanna Svensson FCB 2 35.37
Patrik Svensson FCB 3 56.23

但无论我做什么,我都无法接受。关于我如何做到这一点的任何提示?长篇大论。

解决方法

尝试重新构建您对正在处理的信息的概念。一旦那是 以结构方式应用 qsort 将使数据库排序 一阵微风。请参阅下面的示例文件:

#include <stdio.h>
#include <stdlib.h>

struct recordType
{
   char forename[30];
   char surname[30];
   char clubname[30];
};

struct skierFileformat
{
   struct recordType post;
   int start_position;
   float tid;
};

void print_skiers(struct skierFileformat (*arr)[3])
{
   for(int i = 0; i < 3; ++i)
      printf(
         "%s %s %s %d %f\n",(*arr)[i].post.forename,(*arr)[i].post.surname,(*arr)[i].post.clubname,(*arr)[i].start_position,(*arr)[i].tid);
}

int cmp_start_pos(void const* a,void const* b)
{
   struct skierFileformat const* left  = (struct skierFileformat const*) a;
   struct skierFileformat const* right = (struct skierFileformat const*) b;
   if(left->start_position < right->start_position)
      return -1;
   if(right->start_position < left->start_position)
      return 1;
   return 0;
}

void sort_on_start_pos(struct skierFileformat (*arr)[3])
{
   qsort(*arr,3,sizeof(struct skierFileformat),cmp_start_pos);
}

int cmp_tid(void const* a,void const* b)
{
   struct skierFileformat const* left  = (struct skierFileformat const*) a;
   struct skierFileformat const* right = (struct skierFileformat const*) b;
   if(left->tid < right->tid)
      return -1;
   if(right->tid < left->tid)
      return 1;
   return 0;
}

void sort_on_tid(struct skierFileformat (*arr)[3])
{
   qsort(*arr,cmp_tid);
}


int main(void)
{
   FILE* dbHandle = fopen("thedatabase.bin","rb");
   if(dbHandle == NULL)
   {
      fprintf(stderr,"Unable to open the database. Aborting.\n");
      return EXIT_FAILURE;
   }
   // for simplicity I "know" there are 3 entries
   struct skierFileformat all_skiers[3] = {0};
   if(fread(all_skiers,sizeof *all_skiers,dbHandle) != 3)
   {
      fprintf(stderr,"Missing entries in the database. Aborting.\n");
      fclose(dbHandle);
      return EXIT_FAILURE;
   }
   printf("Content before sort:\n");
   print_skiers(&all_skiers);
   sort_on_start_pos(&all_skiers);
   printf("Content after sort on start position:\n");
   print_skiers(&all_skiers);
   sort_on_tid(&all_skiers);
   printf("Content after sort on tid:\n");
   print_skiers(&all_skiers);
   fclose(dbHandle);
   return EXIT_SUCCESS;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-