gpt4 book ai didi

创建结构数组的数组

转载 作者:太空宇宙 更新时间:2023-11-04 08:10:05 25 4
gpt4 key购买 nike

目标

要创建结构数组的数组,维度基于文件。然后将其存储到链接列表中。

我正在读取格式如下的文件:

读取格式如下的文件:

name (string)  country (string)  age (int)
john USA 54
Sam Aus 18
ect

我不知道文件会有多少行和列,也不知道每一列的变量类型

因此理论上,第一个结构数组将包含 [列数] 个结构,这些结构将沿线存储每个变量(使用空指针和类型转换)(因此 strucArrayCol[0] = john , structArrayCol[1] = USA等)。

这些结构数组中的每一个都将存储到另一个结构数组中,该数组将具有 [NUMBER OF ROWS] 个元素,因此 strucArray2Row[0] = strucArrayCol(包含 john 、 USA 和 54)和 strucArrayRow[1] 将包含另一个包含 (sam Aus 18) 的 strucArrayCol。

所以现在我可以读取文件,找到数字或行、列以及每列的变量类型。

这是我开始遇到麻烦的地方,因为我不确定该怎么做

1. How to create this array within array ( I know i need to use Malloc)
2.How I would store the variables in the first array of struc, if I
wanted to store age could I just do

void *data = malloc(sizeof(int));
*((int*)data) = TEMP_AGE;

void 数据是 StrucArrayCol 中的一个结构(在这个例子中,如果我想存储 John void* 的年龄,数据将在 StucArrayCol[3] 中,它位于 StucArrayRow[0] 中,因为它在第一行)

抱歉,如果这个剂量有意义谢谢

最佳答案

你可以在一个链表中创建一个链表,假设你厌恶任何不是链表的东西!声明两个链表节点结构,一个用于文件中的行,一个用于每一行中的列:

struct column
{
char *buf;
struct column *next;
};

struct row
{
struct column *head;
struct row *next;
};

一次一行读取文件,为每一行添加一个节点。每行都有自己的链接列表,它将把行解析为列。

struct column* column_create(struct column* cursor, char *line)
{
struct column *node = malloc(sizeof(struct column));
node->next = 0;
node->buf = malloc(strlen(line) + 1);
strcpy(node->buf, line);
if (cursor)
cursor->next = node;
return node;
}

struct row* row_create(struct row* cursor, char *line)
{
struct row *node = malloc(sizeof(struct row));
node->next = 0;
node->head = 0;

//parse the line in to columns
struct column *col = 0;
char *token = strtok(line, " \n");
while (token)
{
col = column_create(col, token);
if (!node->head)
node->head = col;
token = strtok(NULL, " \n");
}

if (cursor)
cursor->next = node;
return node;
}

或者您可以使用二维文本数组(这将是三维字符数组)执行此操作。或者使用一个字符串数组来保存文件中的所有行,然后将每一行解析到列中。从那里,您可以测试每一列以查看它是否为整数。

如果您不知道文件中的行数,请使用 realloc 分配运行时所需的内存。此示例读取文件中的所有行,并将其复制到一个行数组中:

int main()
{
FILE *f = fopen("test.txt", "r");
char **lines = 0;
int lines_size = 0;
int lines_capacity = 0;
char buf[1024];
while (fgets(buf, sizeof(buf), f))
{
int len = strlen(buf);
if (!len) continue;
if (lines_size == lines_capacity)
{
lines_capacity += 16;
lines = realloc(lines, lines_capacity * sizeof(char*));
}

lines[lines_size] = malloc(len + 1);
strcpy(lines[lines_size], buf);
lines_size++;
}

int i;
for (i = 0; i < lines_size; i++)
printf("%s", lines[i]);
printf("\n");

for (i = 0; i < lines_size; i++)
free(lines[i]);
free(lines);
return 0;
}

只要文件中的行长度不超过 1024,这就会起作用。另外,您可以使用 strtok

解析每一行
void parseline(char *line)
{
char copy[1024];
strcpy(copy, line);
char *token = strtok(copy, " \n");
while (token)
{
printf("[%s], ", token);
token = strtok(NULL, " \n");
}
printf("\n");
}

关于创建结构数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40146044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com