目的
要创建结构数组的数组,请根据文件创建尺寸。然后将其存储到链接列表中。
我正在读取格式如下的文件:
读取以下格式的文件:
name (string) country (string) age (int)
john USA 54
Sam Aus 18
ect
我不知道文件有多少行和列,也不知道每列的变量类型
所以从理论上讲,第一个struct数组将包含[NUMBER OF COLUMNS]结构,它将沿着该行存储每个变量(使用void指针和类型转换)(所以strucArrayCol [0] = john,structArrayCol [1] = USA ECT)。
这些结构数组中的每一个都将被存储到另一个结构数组中,这些结构将具有[NUMBER OF ROWS]个元素,因此strucArray2Row [0] = strucArrayCol(包含john,USA和54)和strucArrayRow [1]将包含另一个strucArrayCol包含(sam Aus 18)。
所以现在我可以读取文件,找到每列的数字或行数,列数和变量类型。
这是我开始遇到麻烦的地方,因为我不确定如何去做
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 *数据的年龄将在StrucArrayCol [3]中,它位于StucArrayRow [0]内,作为其第三个col第一行)
对不起,如果这个剂量有意义 感谢
答案 0 :(得分:1)
您可以在链接列表中创建链接列表,假设存在对任何非链接列表的厌恶!声明两个链表节点结构,一个用于文件中的行,另一个用于每行中的列:
struct column
{
char *buf;
struct column *next;
};
struct row
{
struct column *head;
struct row *next;
};
一次读取一行文件,为每一行添加一个row
节点。每行都有自己的链接列表,它会将行解析为列。
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");
}
答案 1 :(得分:1)
您需要链接列表中的链接列表。 巴马克写了如何获取数据。所以这是如何获取链表。
$("#"+j).prop('checked', true)
它非常集群,有很多开销,很难管理,但它应该有用。
垂直指针也可以是正确的类型,因为类型不会在列中更改。