如何在c中按存储在文件中的数字进行排序?

lrpiutwd  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(127)

我想读取下面的数据并将其存储在一个结构体中,然后按最旧的排序。我想将一个包含排序数据的结构体写入一个新文件。(按升序从最旧到最新排序)
数据类型:

24 Zachary Gordon
54 Cuba Gooding
67 Peter Killian Gallagher
36 Kyle Gallner

我想要输出:

24 Zachary Gordon
36 Kyle Gallner
54 Cuba Gooding
67 Peter Killian Gallagher

我代码:

#include <stdio.h>
#define N 4

struct Data {
    int age;
    char name[30];
};

void sortData(struct Data aa[]);

int main() {
    struct Data aa[N];
    struct Data tmp;

    FILE *input, *output;
    
    input = fopen("data.txt", "r");
    output = fopen("output.txt", "w");

    if (input == NULL) {
        printf("Fail to read file");
    }
    
    for (int i = 0; i < N; i++) {
        fscanf(input, "%d", &aa[i].name);
        fgets(aa[i].name, 30, input);

    }
    
    for (int i = 0; i < N; i++) {
        printf("%d %s", aa[i].age, aa[i].name);
    }

    fclose(input);

    sortData(aa);

    for (int i = 0; i < N; i++) {
        fprintf(output, "%d %s", aa[i].age, aa[i].name);
    }

    return 0;
}

void sortData(struct Data aa[]) {
    struct Data tmp;

    for (int i = 0; i < N - 1; i++) {
        for (int j = i + 1; j < N; j++) {
            if (aa[i].age > aa[j].age) {
                tmp = aa[i];
                aa[i] = aa[j];
                aa[j] = tmp;
            }
        }
    }
}

我不知道哪里出了问题。提前感谢那些谁会回复

watbbzwu

watbbzwu1#

在测试你的代码时,我收到了一些警告,涉及到从data.txt文件扫描数据,也没有看到代码实际存储年龄的位置。考虑到这一点,我对代码做了如下调整:

#include <stdio.h>

#define N 4

struct Data {
    int age;
    char name[30];
};

void sortData(struct Data aa[]);

int main() {
    struct Data aa[N];
    //struct Data tmp;  /* Don't need this here.  It is defined within the function as a local structure */

    char data[65];

    FILE *input, *output;

    input = fopen("data.txt", "r");
    output = fopen("output.txt", "w");

    if (input == NULL) {
        printf("Fail to read file");
    }

    for (int i = 0; i < N; i++) {
        fgets(data, 64, input);                             /* Read in the full line first */
        sscanf(data, "%d %[^\n]", &aa[i].age, aa[i].name);  /* Then parse it to separate and store the age and name */
    }

    for (int i = 0; i < N; i++) {
        printf("%d %s\n", aa[i].age, aa[i].name);
    }

    fclose(input);

    sortData(aa);

    for (int i = 0; i < N; i++) {
        fprintf(output, "%d %s\n", aa[i].age, aa[i].name);
    }

    return 0;
}

void sortData(struct Data aa[]) {
    struct Data tmp;

    for (int i = 0; i < N - 1; i++) {
        for (int j = i + 1; j < N; j++) {
            if (aa[i].age > aa[j].age) {
                tmp = aa[i];
                aa[i] = aa[j];
                aa[j] = tmp;
            }
        }
    }
}

有些事项要指出。

  • 使用fgets函数获取完整的数据行,而不是使用fscanf从文件中读入一行数据。
  • 输入了整行数据后,调用sscanf函数解析该行,并将年龄存储到结构的age元素中,然后将姓名存储到结构的name元素中。

通过这些调整并使用您的数据创建一个文本文件,在终端上查看了以下数据。

@Dev:~/C_Programs/Console/StructureSort/bin/Release$ ./StructureSort 
24 Zachary Gordon
54 Cuba Gooding
67 Peter Killian Gallagher
36 Kyle Gallner

给予一下,看看它是否符合你的项目的精神。

相关问题