parsing – How to parse in C

parsing – How to parse in C

With a function to read lines from a file, such as get_line (POSIX), or this portable read_line function that I just wrote for this, you can then split the line into tokens using strtok with the delimiter set to ; (make sure to remove the trailing n from the line first). You can then copy each token into the relevant array.

However, as your file format is essentially a CSV file, and you might end up wanting to add more columns or rows in the future, you could use something like libcsv (documentation).

A quick solution to this might look something like this:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern size_t read_line(FILE *file, char **line);

typedef enum Category {
} Category;

Category next_category(const Category category)
    return (Category) ((category + 1) % 3);

int main(void)
    char *object[3];
    char *description[3];
    char *type[3];
    size_t counter = 0;

    FILE *file = fopen(example.csv, r);
    char *line = NULL;
    size_t length = 0;
    while ((length = read_line(file, &line)) > 0 && counter < sizeof(object)) {
        Category token_category = 0;
        char *next_token = strtok(line, ;);
        while (next_token != NULL) {
            size_t token_length = strlen(next_token);
            switch (token_category) {
                case OBJECT:
                    object[counter] = calloc(token_length, sizeof(char));
                    memcpy(object[counter], next_token, token_length);
                case DESCRIPTION:
                    description[counter] = calloc(token_length, sizeof(char));
                    memcpy(description[counter], next_token, token_length);
                case TYPE:
                    type[counter] = calloc(token_length, sizeof(char));
                    memcpy(type[counter], next_token, token_length);
            // Read the next token from the same string
            next_token = strtok(NULL, ;);
            token_category = next_category(token_category);
    printf(Objects:      %s, %s, %sn, object[0], object[1], object[2]);
    printf(Descriptions: %s, %s, %sn, description[0], description[1], description[2]);
    printf(Types:        %s, %s, %sn, type[0], type[1], type[2]);
    return 0;

U should not declare char array if u want to store like this.

 char object[3] = {Cat, Dog, Tea};
 char description[3] = {Small, Big, Warm};
 char type[3] = {Animal, Animal, Drink};

U should declare array of char pointer

char *object[] = {Cat, Dog, Tea};
char *description[] = {Small, Big, Warm};
char *type[] = {Animal, Animal, Drink};

parsing – How to parse in C

Leave a Reply

Your email address will not be published.