c - 如何排序文件输出?

标签 c file sorting struct

我有一个程序接受用户输入并创建包含用户输入的多个字段的记录。要求用户输入人员的名字和姓氏、地址、城市、州、邮政编码和电话号码。我正在尝试根据每条记录的城市按字母顺序对记录进行排序。我该怎么做,我很困惑如何根据一个变量进行排序,然后正确打印整个记录。

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

typedef struct Record Record;

struct Record
    {
        char fname[51];
        char lname[51];
        char address[51];
        char city[51];
        char state[51];
        char zipcode[51];
        char phoneNumber[51];

        Record *next;
    };


int main()
{
    FILE *fileWriter;
    const char filename[] = "data.txt";
    char answer = '\0';
    Record *records = NULL;
    Record *records_first = NULL;
    Record *records_previous = NULL;

    fileWriter = fopen(filename,"wt");

    if(fileWriter != NULL) {

        for( ; ; ) {
            records = (Record*) malloc(sizeof(Record));  

            if(records_first == NULL)
                records_first = records;

            if(records_previous != NULL)
                records_previous->next = records;

            records = records_first;
            printf("First Name: \n");
            scanf("%s", records->fname);
            fprintf(fileWriter,"%s\t",records->fname);

            printf("Last Name: \n");
            scanf("%s", records->lname);
            fprintf(fileWriter,"%s\t",records->lname);

            printf("Address: \n");
            scanf(" %[^\n]", records->address);
            fprintf(fileWriter,"%s\t",records->address);

            printf("City: \n");
            scanf("%s", records->city);
            fprintf(fileWriter,"%s\t",records->city);

            printf("State: \n");
            scanf("%s", records->state);
            fprintf(fileWriter,"%s\t",records->state);

            printf("Zipcode: \n");
            scanf("%s", records->zipcode);
            fprintf(fileWriter,"%s\t",records->zipcode);

            printf("Phone Number: \n");
            scanf("%s", records->phoneNumber);
            fprintf(fileWriter,"%s\t\n",records->phoneNumber);

            records->next = NULL;
            records_previous = records;

            printf("Are there anymore records? [y/n] ");
            scanf(" %c", &answer);

            if(tolower(answer) != 'y') {
                free(records);
                fclose(fileWriter);
                break;
            }
        }

    } else
        printf("Error opening file.");

    return 0;
}

                        **Edited Version**

我尝试使用 qsort()。但最终出现了 fatal error 。最重要的是,当我只能对一个字段进行排序时,如何正确打印整条记录?

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

struct Record
    {
        char fname[51];
        char lname[51];
        char address[51];
        char city[51];
        char state[51];
        int zipcode;
        int phoneNumber;
    };

int compare_city(const void *const p1, const void *const p2)
 {
    struct Record *r1 = (struct Record *) p1;
    struct Record *r2 = (struct Record *) p1;

    return strcmp(r1->city, r2->city);
 }


int main()
{
    FILE *fileWriter;
    const char filename[] = "data.txt";
    char answer = 'y';
    int size = 1;
    int i = 0;
    int count = 1;
    struct Record *records = NULL;
    struct Record *records_temp = NULL;


    fileWriter = fopen(filename,"wb");
    if(fileWriter != NULL)
        while(answer == 'y' || answer == 'Y')
        {
            if(records_temp == NULL)
            {
                struct Record *records_temp = realloc(records,(size)*sizeof(*records));
            }

            records = records_temp;
            printf("First Name: \n");
            scanf("%s", records[i].fname);


            printf("Last Name: \n");
            scanf("%s", records[i].lname);


            printf("Address: \n");
            scanf(" %[^\n]", records[i].address);


            printf("City: \n");
            scanf("%s", records[i].city);


            printf("State: \n");
            scanf("%s", records[i].state);


            printf("Zipcode: \n");
            scanf("%s", records[i].zipcode);


            printf("Phone Number: \n");
            scanf("%s", records[i].phoneNumber);

            //stores all record info

            printf("Are there anymore records? [y/n] ");
            scanf(" %c", &answer);


        if(tolower(answer) == 'y')
        {
            i++;
            count++;
        }

        for(i = 0; i < count ; i++)
        {
            qsort(records, count, sizeof(struct Record), compare_city);
            fprintf(fileWriter,"%s\n",records[i].fname);
            fprintf(fileWriter,"%s\n",records[i].lname);
            fprintf(fileWriter,"%s\n",records[i].address);
            fprintf(fileWriter,"%s\n",records[i].city);
            fprintf(fileWriter,"%s\n",records[i].state);
            fprintf(fileWriter,"%d\n",records[i].zipcode);
            fprintf(fileWriter,"%d\n",records[i].phoneNumber);
        }

        free(records);
    }
    return 0;
}

最佳答案

照原样,你有一个列表结构,不能用 qsort() 排序, 但您可以改用数组,并使用 malloc() 动态分配它+ realloc() .

要对条目进行排序,您可以使用 qsort() ,例如假设你想按名字排序,然后

int compare_first_name(const void *const p1, const void *const p2)
 {
    struct Record *r1 = (struct Record *) p1;
    struct Record *r2 = (struct Record *) p1;

    return strcmp(r1->fname, r2->fname);
 }

然后

qsort(base, count, sizeof(struct Record), compare_first_name);

关于c - 如何排序文件输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30552873/

相关文章:

c - 将 select() 与管道一起使用

C 密码数据库

java - 内存中的文件是否与文件系统中的文件大小相同?

python - 获取最小 MSE python 的路径

linux - 尝试根据每条记录的内容将一个非常大的文件拆分成多个较小的文件 (perl/linux)

c - 给定范围内数字的 while 循环和回文

c - C 递归子程序中释放内存

php - ./和 ../在 PHP 中的区别

r - 是否有充分的理由使用 `sort` 和 `index.return = TRUE` 而不是 `order` ?

c - glibc 检测到 free() : invalid next size (fast)