Avatar billede tchami Nybegynder
30. september 2003 - 23:14 Der er 5 kommentarer og
1 løsning

Sorter fil indhold i C

Hej,

Mit spørgsmål er meget kort, men svaret kan jeg ikke hitte ud af. Hvordan sorterer man indholdet af en fil?

Jeg kunne forestille mig at det mest hensigtsmæssige var at ligge hver enkelt linie i filen ned i et array, derefter sortere arrayet og til sidst skrive til filen, men hvordan?

Indholdet af filen ser sådan ud:

Name: John    Grade:10
Name: Hans    Grade:2
Name: Mads    Grade:5
Name: Allan    Grade:3

Men det skal være muligt at have flere linier og samtidig sortere dem uden at ændre i koden.
Avatar billede arne_v Ekspert
30. september 2003 - 23:42 #1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct info
{
  char *name;
  int grade;
};

void qs_help(int n1,int n2,struct info *a)
{
  struct info tmp;
  int l = n1;
  int r = n2;
  int pivot = a[(n1+n2)/2].grade;
  do {
      while(a[l].grade<pivot) l++;
      while(a[r].grade>pivot) r--;
      if(l<=r) {
        tmp = a[l];
        a[l] = a[r];
        a[r] = tmp;
        l++;
        r--;
      }
  } while(l<=r);
  if(n1<r) qs_help(n1,r,a);
  if(l<n2) qs_help(l,n2,a);
  return;
}

void qs(int n,struct info *a)
{
  qs_help(0,n-1,a);
  return;
}

#define KEY1 "Name:"
#define KEY2 "Grade:"

int main()
{
  int i,n;
  char line[133],*p1,*p2;
  struct info data[5000];
  FILE *fp = fopen("z.z", "r");
  n=0;
  while(!feof(fp)) {
      if(fgets(line,sizeof(line),fp))
      {
          p1 = strstr(line,KEY1) + strlen(KEY1);
          while(*p1==' ') p1++;
          p2 = strchr(p1,' ');
          data[n].name = (char *)malloc(p2-p1);
          strncpy(data[n].name,p1,p2-p1);
          data[n].name[p2-p1] = '\0';
          data[n].grade = atoi(strstr(line,KEY2)+strlen(KEY2));
          n++;
      }
  }
  fclose(fp);
  printf("usorteret:\n");
  for(i=0;i<n;i++)
  {
      printf("%d,\"%s\"\n",data[i].grade,data[i].name);
  }
  qs(n,data);
  printf("sorteret:\n");
  for(i=0;i<n;i++)
  {
      printf("%d,\"%s\"\n",data[i].grade,data[i].name);
  }
  return 0;
}
Avatar billede arne_v Ekspert
30. september 2003 - 23:42 #2
Output på dine test data:

usorteret:
10,"John"
2,"Hans"
5,"Mads"
3,"Allan"
sorteret:
2,"Hans"
3,"Allan"
5,"Mads"
10,"John"
Avatar billede arne_v Ekspert
30. september 2003 - 23:43 #3
Kan klare op til 5000 records. Og det tal kan nemt øges. Det er nok lidt
bøvlet at gøre det helt dynamisk i C.
Avatar billede arne_v Ekspert
30. september 2003 - 23:43 #4
Koden validerer ikke data men forventer korrelt input.
Avatar billede arne_v Ekspert
30. september 2003 - 23:47 #5
Udskrivning til fil er bare:

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

struct info
{
  char *name;
  int grade;
};

void qs_help(int n1,int n2,struct info *a)
{
  struct info tmp;
  int l = n1;
  int r = n2;
  int pivot = a[(n1+n2)/2].grade;
  do {
      while(a[l].grade<pivot) l++;
      while(a[r].grade>pivot) r--;
      if(l<=r) {
        tmp = a[l];
        a[l] = a[r];
        a[r] = tmp;
        l++;
        r--;
      }
  } while(l<=r);
  if(n1<r) qs_help(n1,r,a);
  if(l<n2) qs_help(l,n2,a);
  return;
}

void qs(int n,struct info *a)
{
  qs_help(0,n-1,a);
  return;
}

#define KEY1 "Name:"
#define KEY2 "Grade:"

int main()
{
  int i,n;
  char line[133],*p1,*p2;
  struct info data[5000];
  FILE *fp,*fp2;
  fp = fopen("z.z", "r");
  n=0;
  while(!feof(fp)) {
      if(fgets(line,sizeof(line),fp))
      {
          p1 = strstr(line,KEY1) + strlen(KEY1);
          while(*p1==' ') p1++;
          p2 = strchr(p1,' ');
          data[n].name = (char *)malloc(p2-p1);
          strncpy(data[n].name,p1,p2-p1);
          data[n].name[p2-p1] = '\0';
          data[n].grade = atoi(strstr(line,KEY2)+strlen(KEY2));
          n++;
      }
  }
  fclose(fp);
  qs(n,data);
  fp2 = fopen("zz.zz", "w");
  for(i=0;i<n;i++)
  {
      fprintf(fp2,"%s %s %s %d\n",KEY1,data[i].name,KEY2,data[i].grade);
  }
  fclose(fp2);
  return 0;
}
Avatar billede tchami Nybegynder
01. oktober 2003 - 00:15 #6
Woooohooooooo :)

Det virker helt perfekt!!

Mange tusinde tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester