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(,,stdin) の代わりに fgets(,,fp) を使用し、構造体 data_t 内の char** の代わりに、すべての mallocs と reallocs で適切な変更を行う構造体 input* を配置できます。構造体のサイズ。

もちろん、構造体 data_t は、必要な構造体の配列の単なるヘッダーであり、配列を配置し、配列の数と現在割り当てられているスペースを追跡するための場所です。

于 2013-10-20T20:58:15.090 に答える