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.
Annonceindlæg fra Deloitte
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; }
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"
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.
30. september 2003 - 23:43
#4
Koden validerer ikke data men forventer korrelt input.
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; }
01. oktober 2003 - 00:15
#6
Woooohooooooo :) Det virker helt perfekt!! Mange tusinde tak.
Kurser inden for grundlæggende programmering