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 {
OBJECT, DESCRIPTION, TYPE
} 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);
break;
case DESCRIPTION:
description[counter] = calloc(token_length, sizeof(char));
memcpy(description[counter], next_token, token_length);
break;
case TYPE:
type[counter] = calloc(token_length, sizeof(char));
memcpy(type[counter], next_token, token_length);
break;
}
// Read the next token from the same string
next_token = strtok(NULL, ";");
token_category = next_category(token_category);
}
free(next_token);
free(line);
++counter;
}
fclose(file);
printf("Objects: %s, %s, %s\n", object[0], object[1], object[2]);
printf("Descriptions: %s, %s, %s\n", description[0], description[1], description[2]);
printf("Types: %s, %s, %s\n", type[0], type[1], type[2]);
return 0;
}