0

malloc 一个结构数组如何使用文件操作来执行以下操作?该文件是 .txt 文件中的输入是这样的:

10
22 3.3
33 4.4

我想从文件中读取第一行,然后我想 malloc 一个输入结构数组,该数组等于要从文件中读取的行数。然后我想从文件中读入数据并读入 malloc 结构数组。稍后我想将数组的大小存储到输入变量大小中。返回一个数组。在此之后,我想创建另一个函数,以与输入文件相同的形式打印输入变量中的数据,并假设函数调用 clean_data 将在最后释放 malloc 内存。

我试过类似的东西:

#include<stdio.h>

struct input
{
    int a;
    float b,c;

}

struct input* readData(char *filename,int *size);

int main()
{


return 0;
}

struct input* readData(char *filename,int *size)
{
    char filename[] = "input.txt";
    FILE *fp = fopen(filename, "r");

    int num;
    while(!feof(fp))
    {
        fscanf(fp,"%f", &num);
                struct input *arr = (struct input*)malloc(sizeof(struct input));

    }

}
4

2 回答 2

1

只需使用一个结构来存储您的输入表和表大小:

typedef struct{
    int a, b;
    float c,d;
}Input;

typedef struct myInputs{
    uint size;
    Input* inputs;
}Input_table;

创建函数以在文件中写入或读取输入:

void addInput(Input_table* pTable, Input* pInput)
{
    pTable->inputs[pTable->size] = (Input*)malloc(sizeof(Input));
    memcpy((*pTable)->inputs[pTable->size], pInput); 
    pTable->size++;
}

Input* readInput(Input_table* pTable, uint index)
{
    if (pTable->size > index)
    {
        return pTable->inputs[index];
    }
    return NULL;
}

您的读取功能变为:

InputTable* readData(char *filename, int *size)
{
    Input_table myTable;
    FILE *fp = fopen(filename, "r");

    int num;
    while(!feof(fp))
    {
        Input newInput;
        fscanf( fp,"%d;%d;%f%f", &(newInput.a), &(newInput.b), &(newInput.c), &(newInput.d));
        addInput( &myTable, &newInput);
    }
}
// Here your table is filled in
printf("table size:%d", myTable.size);

}

于 2013-10-20T21:16:59.737 回答
0

做你正在寻找的东西非常昂贵,因为你必须多次阅读整个文件。相反,请考虑制作一个动态结构数组,当空间不足时可以调整其大小。

    struct data_t {
            int nval;               /* current number of values in array */
            int max;                /* allocated number of vlaues */
            char **words;           /* the data array */
    };

    enum {INIT = 1, GROW = 2};

    ...
    while (fgets(buf, LEN, stdin)) {
            if (data->words == NULL)
                    data->words = malloc(sizeof(char *));
            else if (data->nval > data->max) {
                    data->words = realloc(data->words, GROW * data->max *sizeof(char *));
                    data->max = GROW * data->max;
            }
            z = strtok(buf, "\n");
            *(data->words + i) = malloc(sizeof(char) * (strlen(z) + 1));
            strcpy(*(data->words + i), z);
            i++;
            data->nval++;           
    }
    data->nval--;

虽然这并不完全是您需要的代码,但它是如此接近,以至于适应您的问题应该很容易。您可以使用 fgets(,,fp) 代替 fgets(,,fp),而不是 struct data_t 中的 char**,您可以只放置一个 struct input*,其中包含所有 malloc 和 realloc 进行适当的更改你的结构的大小。

当然,struct data_t 只是您想要拥有的结构数组的标头,用于放置数组并跟踪您拥有的数量以及当前分配的空间。

于 2013-10-20T20:58:15.090 回答