(有些代码可能用葡萄牙语,我试图翻译所有内容)
我有一个这样的文本文件:
609140307 Carla Aguiar Cunha Paredes Pires PT 309 181 020 533 713 02F 13.8
814991297 Ricardo Andrade Nogueira Matos PT 099 597 635 807 514 05D 10.35
843818099 Eduardo Carneiro Paredes Clementino Castro PT 829 961 009 571 587 02D 5.75
647507641 Cristiana Eanes Almada Martins Baptista PT 257 687 479 093 378 02E 10.35
684741046 Marisa Calado Cardoso Quadros Barbosa PT 722 479 016 817 208 0RC 10.35
945973986 Leonor Leal Estrela Moreira PT 385 455 554 278 760 01D 6.9
499505062 Paula Nogueira Seixas Carrico PT 780 968 629 467 061 04E 10.35
714448831 Carina Carvalheira Ramalho Dinis Valbom PT 025 270 973 606 341 02D 5.75
...
//[contract_id], [name], [street_id], [power]
我定义了这样的结构:
#define MAX 150
typedef struct contracts {
int contract_id;
char name[MAX];
char street_id[MAX];
float power;
} Contracts;
我的老师做了这个功能,将行分成数组,返回变量Res。 Res [0]对应contract_id,Res [1]对应名称,......
#define MAX_LINHA_FICHEIRO 150
#define STRING char *
typedef char LinhaTexto[MAX_LINHA_FICHEIRO];
LinhaTexto LT;
STRING *Read_Split_Line_File(FILE *f, int n_max_fields, int *n_read_fields, char *separators)
{
*n_read_fields = 0;
if (!f) return NULL;
if (fgets(LT, MAX_LINHA_FICHEIRO, f) != NULL)
{
STRING *Res = (STRING *)malloc(n_max_fields * sizeof(STRING));
char *pch = strtok(LT, separators);
int count = 0;
while (pch != NULL)
{
Res[count] = (char *)malloc((strlen(pch) + 1) * sizeof(char));
strcpy(Res[count++], pch);
pch = strtok(NULL, separators);
}
*n_read_fields = count;
return Res;
}
return NULL;
};
我不知道如何以及我需要将所有这些行存储到struct Contracts 中。如果你能帮助我,我会很感激。
答案 0 :(得分:0)
教师的代码适度令人震惊。它返回一个动态分配的指针数组,但实际上它们指向全局变量LT
,这是一个包含150个字符的数组。因此,每次调用read_split_line_file()
都会覆盖以前的数据。做动态分配似乎有点傻。让调用代码提供指针数组,甚至是行缓冲区也是合理的。
但是,您似乎打算使用以下功能:
FILE *fp = fopen(data_file_name, "r");
…error check fp…
enum { MAX_CONTRACT = 150 };
Contracts contract[MAX_CONTRACT];
int i;
for (i = 0; i < MAX_CONTRACT; i++)
{
char **row;
int num_fields;
if ((row = read_split_line_file(fp, 4, &num_fields, "\t")) == 0)
break;
if (num_fields != 4)
…report format error…
…convert row[0] into contract[i].contract_id;
…copy row[1] into contract[i].name;
…copy row[2] into contract[i].street_id;
…convert row[3] into contract[i].power;
free(row);
}
fclose(fp);
/* You have i valid contracts here */
您需要使用适当的代码填写以…
开头的行。