从C中的文件中动态分配结构的数组



我有一个我要编写的程序,该程序将打开一个名为list.txt的文件,此文件将在每行上包含一个num,id和一个字符串名称。此程序将读取list.txt文件,然后对ID号进行排序,并打印出具有数字和名称的INDEX.txt文件的ID。我写了一个程序代码,它正在工作...

这是我的列表.txt

(num,id,name)

0 3 AB
1 2 BC
2 28 DC
3 1 EF
4 13 BB
10 30 CC
11 23 FF
14 16 GG

编译了此程序排序的ID和名称,请打印到index.txt,应该是:

(id,num,name)

1 3 EF
2 1 BC
3 0 AB
13 4 BB
16 14 GG
23 11 FF
28 2 DC
30 10 CC

这是我的程序代码:

#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <stdlib.h>
#include <string.h>
#define NUM_NUMBERS 9
typedef struct student
{   
    int num;
    int id;
    char name[100];
}end;
void update();
void Sort(student array[], int n); 
void load_menu();
void add(end *e);
void search(end e);
void view(end e);
FILE *fp;
FILE *f1;
int main(int argc, char** argv)
{
    load_menu();
    return 0;
}
void update()
{
    end st[15];
    int sayi[NUM_NUMBERS], number, i=0, j=0;
    fp=fopen("list.txt", "r");
    if( fp == NULL ) 
    {
        printf("File is not found at add();n");
        exit(0);
    }
    while(!feof(fp))
    {
        fscanf(fp,"%d%d%s",&st[i].num,&st[i].id,st[i].name);
        i++;
    }
    Sort(st, NUM_NUMBERS);
    f1=fopen("index.txt", "w");
    for(int i=0; i<NUM_NUMBERS;i++)
    {
        fprintf(f1, "%d %d %sn", st[i].id, st[i].num, st[i].name);
    }
}
void Sort(end array[], int n)
{
    int Min;
    for(int i=0; i<n-1;i++)
    {
        Min=i;
        for(int j=i+1;j<n;j++)
        {
            if(array[j].id<array[Min].id)
            {
                Min=j;
            }
        }
        end temp=array[i];
        array[i]=array[Min];
        array[Min]=temp;
    }
}
void load_menu(void)
{
    end e; 
    int choice;
    do
    {
        printf("1. Find a record given its ID value n");
        printf("2. Add a new record to the file n");
        printf("3. View Recordsn");
        printf("4. Exitnn");
        printf("Please choose one: ");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:
                search(e);
                break;
            case 2: add(&e);
                    update();
                break;
            case 3: view(e);
                break;
            case 4: printf("Done.");
                return;
                break;
            default: printf("Invalid choicen");
        }
    }while (choice != 5);
    system("cls");
} 
void add(end *e)
{
    int i=0;
    system("cls");
    fp = fopen ( "list.txt", "a" );
    if( fp == NULL ) 
    {
        printf("File is not found at add();n");
        exit(0);
    }
    printf("n-----Add a new record-----n");
    printf("Enter number: ");
    scanf("%d", &e->num);
    printf("nEnter ID : ");
    scanf("%d",&e->id);
    printf("nEnter name: ");
    scanf("%s",e->name);
    fscanf(fp,"%d %d %snn",&e->num, &e->id, e->name);
    fprintf(fp,"%d %d %snn",e->num ,e->id, e->name);
    fclose(fp);
    return;
}
void search(end e)
{
    int i=0;
    int sid;
    system("cls");
    fp = fopen ("list.txt", "r");
    if(fp==NULL)
    {
        printf("File is not found at search();");
    }
    printf("n-----Search ID-----n");
    printf("nEnter ID : ");
    scanf("%d",&sid);
    printf("nNumber   ID       Name");
    while(!feof(fp))
    {
        fscanf(fp,"%d %d %s", &e.num, &e.id, &e.name);
        if(sid==e.id)
        {   
            printf("n%d        %d        %s",e.num ,e.id, e.name);
        }
    }
    printf("nn");
    fclose(fp);
}
void view(end e)
{
    int i=0;
    system("cls");
    printf("n-----list.txt-----n");
    fp = fopen("list.txt", "r");
    if(fp == NULL)
    {
        printf("File is not found at view();n");
        exit(0);
    }
    printf("nNumber   ID       Name");
    printf("n");
    while(fscanf (fp, "%d %d %s ",&e.num, &e.id, &e.name) != EOF )
    printf("n%d        %d        %s",e.num ,e.id, e.name);
    printf("nn");
    printf("-----index.txt-----n");
    f1 = fopen("index.txt", "r");
    if(fp == NULL)
    {
        printf("File is not found.n");
        exit(0);
    }
    printf("nNumber   ID       Name");
    printf("n");
    while(fscanf (f1, "%d %d %s ",&e.id, &e.num, &e.name) != EOF )
    printf("n%d        %d        %s",e.id ,e.num, e.name);
    printf("nn");
    fclose(fp);
    fclose(f1);
    return;
}

,但我只使用数组,因此我需要在结构数组中动态分配以存储信息。仍然不知道如何动态分配(malloc)。您能告诉我如何与代码动态使用吗?感谢您的帮助。(对不起,英语不好。)

示例代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct student{   
    int num;
    int id;
    char name[100];
}end;
int cmp(void const *a, void const *b){
    const end *x = a;
    const end *y = b;
    return x->id < y->id ? -1 : x->id > y->id;
}
int main(void){
    end *st = NULL, tmp;
    FILE *fp;
    size_t i = 0, n = 0;
    fp=fopen("list.txt", "r");
    if( fp == NULL ) {
        perror("fopen at XXX");
        exit(EXIT_FAILURE);
    }
    while(3 == fscanf(fp,"%d %d %s", &tmp.num, &tmp.id, tmp.name)){
        end *temp = realloc(st, ++n * sizeof(*st));//Secure multiple records when the number of records is large
        if(temp == NULL){
            perror("realloc at XXX");
            free(st);
            exit(EXIT_FAILURE);
        }
        st = temp;
        st[i++] = tmp;
    }
    fclose(fp);
    qsort(st, n, sizeof(*st), cmp);
    fp=fopen("index.txt", "w");
    for(i = 0; i < n; ++i){
        fprintf(fp, "%d %d %sn", st[i].id, st[i].num, st[i].name);
    }
    fclose(fp);
    free(st);
}

malloc()返回指向您分配的内存的指针。参数是您要分配的内存的大小,因此在您的情况下,它的大小是" end"的大小。

您需要先声明"结束"指针,然后致电malloc()。

end * ptr = malloc(sizeof(end));

但这只是一个元素。您绝对应该查看c。

中的列表的教程

相关内容

  • 没有找到相关文章

最新更新