创建结构数组的数组

时间:2016-10-20 05:21:52

标签: c arrays pointers

目的

要创建结构数组的数组,请根据文件创建尺寸。然后将其存储到链接列表中。

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

读取以下格式的文件:

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第一行)

对不起,如果这个剂量有意义 感谢

2 个答案:

答案 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)

它非常集群,有很多开销,很难管理,但它应该有用。

垂直指针也可以是正确的类型,因为类型不会在列中更改。