在C中动态分配文件中的struct数组

时间:2016-12-09 10:37:40

标签: c file dynamic malloc

我有一个我正在编写的程序,它将打开一个名为list.txt的文件,该文件将在每行包含num,ID和字符串名称。该程序将读取list.txt文件并对ID号进行排序,并将带有编号和名称的已排序ID打印到index.txt文件中。我写了一个程序代码,它正在工作......

这是我的list.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 %s\n", 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 Records\n");
        printf("4. Exit\n\n");
        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 choice\n");
        }
    }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 %s\n\n",&e->num, &e->id, e->name);
    fprintf(fp,"%d %d %s\n\n",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("\n\n");
    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("\n\n");

    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("\n\n");

    fclose(fp);
    fclose(f1);
    return;
}

但我只使用数组,所以我需要在struct数组中动态分配来存储信息。还是不知道如何使用动态分配(malloc)。你能告诉我如何动态地使用代码吗?谢谢你的帮助。 (抱歉英文不好。)

2 个答案:

答案 0 :(得分:1)

示例代码:

#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 %s\n", st[i].id, st[i].num, st[i].name);
    }
    fclose(fp);
    free(st);
}

答案 1 :(得分:0)

malloc() returns a pointer to the memory you allocated. The argument is the size of the memory you want to allocate, so in your case its the size of of "end".

You need to declare a pointer to "end" first and then call malloc().

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

But thats just one Element. You should definitely check out a tutorial for lists in c.