Абстракция массива структуры - PullRequest
0 голосов
/ 23 сентября 2019

Я создаю простой жестко запрограммированный парсер csv, который выглядит следующим образом:

typedef struct {
    char * id;
    char * date;
} ROW;

int main(int argc, char *argv[]) {

    // Load a file that is of a known csv format
    // With fields separated by ","
    // And allow a max line length of 255 chars
    FILE * fp = fopen("test100k.csv", "r");
    char* FIELD_SEPARATOR = ",";
    char buffer[255];

    int row_num = 0;
    ROW row;
    ROW * rows = malloc(sizeof(row) * 120000);

    // The first line is the header so we can just skip it
    (void) fgets(buffer, sizeof(buffer), fp);

    while(fgets(buffer, sizeof(buffer), fp) != NULL) {  

        // split the row
        char *token;
        token = row.id = strtok(buffer, FIELD_SEPARATOR);
        int num_sep_encountered = 1;

       while( token != NULL ) {
          token = strtok(NULL, FIELD_SEPARATOR);
          switch(num_sep_encountered)  {
              case 1: row.date = token;
          }
          num_sep_encountered ++;
       }

        printf("ID: %s | Date: %s\n", row.id, row.date);
        rows[row_num++] = row;
    }

}

Я хотел бы изменить это так, чтобы у меня была вторая структура с именем ROWS, которая выглядит следующим образом:

typedef struct {
    ROW * row;
    size_t size;
} ROWS;

Как мне создать и инициализировать эту структуру в следующих трех местах:

// initialize it -- how to do this?
ROWS rows= malloc(sizeof(row) * 120000);

// how keep appending a ROW to the ROWS in the for loop?
rows->row = row

// how to set the size
rows.size = row_num

1 Ответ

2 голосов
/ 23 сентября 2019

Многомерные инициализации могут быть выполнены следующим образом:

const size_t no_rows = 120000;
const size_t row_size = 100;
ROWS *rows = malloc(sizeof(*rows) * no_rows);
for(size_t i=0; i<no_rows; i++) {
    rows[i].row = malloc(sizeof(*rows[0].row) * row_size);
    rows[i].size = row_size;
}

Не забудьте проверить возвращаемое значение malloc.

...