从文件C动态分配struct数组

时间:2015-02-15 21:38:30

标签: c arrays file struct

我有一个程序正在尝试编写,它将打开一个名为hw3.data的文件,该文件将在每行包含一个字符串,一个浮点数,一个int和一个字符串。示例:someword 5.4 200000 someword 我不知道文件的大小或文件中字符串的大小。我需要在struct数组中动态分配来存储信息。我是C的新手并且已经查看了其他各种问题和文章,但是他们都没有真正帮助我掌握如何解决这个问题。 我认为解决这个问题的最佳方法是先静态声明一个结构。读取文件的长度,然后从静态结构中获取信息,然后动态分配。  这是我到目前为止的代码:

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

//Static Array of Struct
struct record{
 char name[100];
 float hp;
 int size;
 char color[30];
};



//getData from file 
int getData(FILE*, struct record[], int currSize){
   fp = fopen("hw3.data","r");
   if (fp !=NULL){
    printf("file Open");
    while(3==fscanf(fp, "[^,],%f,%d,[^,]", records[i].name &records[i].hp,  &records[i].size, records[i].color)){
        currSizef++;
    }
} else {
    printf("failed");
    }
 return 0;
}

//First sorting function to sort by FLOAT value

//Second sorting function to sort by INT value


int main()
{
 int currSizef=0;
 struct record *records;
 FILE* fp = NULL;

 int choice;
//menu 
  do
   {
    printf("\t\tMenu\n");
    printf("Options:\n");
    printf("Input a number to select option:\n");
    printf("1-Sort floats high to low\n 2-Sort floats low to high\n");
    printf("3-Sort intergers high to low\n 4-Sort intergers low to high\n");
    printf("5-Exit\n");
    scanf("%d", &choice);

    switch (choice)
    {
    case 1: /*Print high to low floats*/
        break;
   case 2: /*print low to high floats*/
    break;
   case 3: /*print high to low ints*/
        break;
   case 4: /*print low to high ints*/
        break;

    }

  }while(choice !=5);
 return 0;
}

1 个答案:

答案 0 :(得分:1)

您可以尝试将数据加载到临时记录中,并使用realloc动态扩展data大小。

注意:如果NULL传递给realloc,那么realloc的行为就像指定尺寸的malloc功能一样。

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

//Static Array of Struct
typedef struct record{
    char name[100];
    float hp;
    int size;
    char color[30];
}RECORD;

void record_copy(RECORD *dest, RECORD* src) {
    strcpy(dest->name,src->name);
    dest->hp = src->hp;
    dest->size = src->size;
    strcpy(dest->color,src->color);
}

//LoadData from file
RECORD* LoadData(FILE* fp,int *size){
    int i = 0;
    RECORD temp;
    RECORD *data= NULL,*tempptr = NULL;
    while( fscanf(fp, "%[^,],%f,%d,%[^,],", temp.name,&temp.hp,&temp.size,temp.color)==4 ) {
        if( (tempptr = (RECORD*) realloc( data, sizeof(RECORD) * (i+1) )) )
            data = tempptr;
        else
            return (NULL);
        record_copy(&data[i],&temp);
        i++;
    }
    *size = i;
    return (data);
}

void record_sort(RECORD *data, int size) {
    int i,j;
    RECORD temp;
    for (i = 0 ; i < ( size - 1 ); ++i)
        for (j = 0 ; j < (size - i - 1); ++j )
            if( data[j].hp > data[j+1].hp ) {
                record_copy(&temp,&data[i]);
                record_copy(&data[i],&data[i+1]);
                record_copy(&data[i+1],&temp);
            }
}

int main() {
    FILE *fp = fopen("<fileName>","r");
    RECORD *data = NULL;
    int i;
    int size;
    if( fp != NULL ) {
        data = LoadData(fp,&size);
    }
    record_sort(data,size);
    for(i = 0;i<size;i++) {
        printf("%s:%f:%d:%s\n",data[i].name,data[i].hp,data[i].size,data[i].color);
    }
    free(data);
    return 0;
}

关于排序,您可以使用任何排序算法对记录进行排序。我举了一个例子。