如何使用struct对C中的文本文件进行排序?

如何使用struct对C中的文本文件进行排序?,c,sorting,struct,linked-list,text-files,C,Sorting,Struct,Linked List,Text Files,我正在尝试根据成员的年龄对文本文件进行排序。我的代码不起作用只是因为第三行和第四行缺少最后一列(town)。如果所有的行都有相同的信息(假设第三行和第四行都有城镇/城市的名称),则可以正常工作。以我的方式,当struct读取第3行时,它读取第4行的第一个单词作为town/city 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _Member{

我正在尝试根据成员的年龄对文本文件进行排序。我的代码不起作用只是因为第三行和第四行缺少最后一列(town)。如果所有的行都有相同的信息(假设第三行和第四行都有城镇/城市的名称),则可以正常工作。以我的方式,当struct读取第3行时,它读取第4行的第一个单词作为town/city

这是我的密码:

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

typedef struct _Member{
    char *name;
    int age;
    int id;
    char *town;
}Member;

int main() {

    FILE *file = fopen("member.txt", "r");
    FILE *newFile = fopen("new_member.txt", "w");

    int counter=0, line = 10;
    int i;
    Member *member = malloc(sizeof(Member)*line);

    for(i =0; i<line; i++){
        int len = 12;
        char *name = malloc(sizeof(char)*(len+1));
        name [len] = '\0';
        int age;
        int id;
        char *town = malloc(sizeof(char)*(len+1));
        town [len] = '\0';

        fscanf(file,"%s %i %i %s\n", name, &age, &id, town);

        member[counter].name = name;
        member[counter].age = age;
        member[counter].id = id;
        member[counter].town = town;

        counter++;
    }
    while(1){
    int swapped = 0, i, j;
    Member temp;
    for (i = 1; i < counter; i++){
        for(j = 0; j <counter - i; j++){
        if(member[j].age > member[j+1].age){
            temp = member[j];
            member[j]=member[j+1];
            member[j+1] = temp;
            swapped = 1;
        }
        }
    }
    if(swapped ==0){
        break;
    }
    }

    for(i = 0; i < counter; i++){
        fprintf(newFile,"%s %d %d %s\n", member[i].name, member[i].age, member[i].id, member[i].town);
    }

    fclose(file);
    fclose(newFile);

    printf("Successful\n");

    return 0;
}
排序后的结果;新建_member.txt文件

John 23 3456 Edinburgh
Will 32 3453 Essex
Robert 33 4567 London
Eli 39 5234 Oxford
Peter 45 4345 Cary
Diane 45 4587 Norfolk
Brandon 45 3214 Brighton
Paul 56 7896 York
Alisha 78 1234 Peterbourgh
56 12345 4345 

我怎样才能解决这个问题?或者,对此类文件进行排序的另一种方法是什么?任何帮助都将不胜感激。谢谢

阅读前三个,然后检查第四个是否存在,如果可能的话分配。请确保在读取这四个参数时没有\n错误。如果遇到一个条目,则假设当前行少于四个(或三个)并开始新行。如果没有城市,则您的
fscanf
将捕获下一个条目的名称。您可以
getline
获取整行内容,然后使用
sscanf
,但仍然需要检查是否具有所有必需的字段。一个很好的方法是编写
splitString
方法。不相关,但您应该检查
fopen
是否返回
NULL
。只是为了防止下一个问题。谢谢大家。并尝试所有建议(y)
John 23 3456 Edinburgh
Will 32 3453 Essex
Robert 33 4567 London
Eli 39 5234 Oxford
Peter 45 4345 Cary
Diane 45 4587 Norfolk
Brandon 45 3214 Brighton
Paul 56 7896 York
Alisha 78 1234 Peterbourgh
56 12345 4345