Я только иногда вижу правильное количество элементов после того, как использую strtok для разделения запятыми и кавычками (двойные кавычки).Обычно printf имеет длину 0, но иногда 6 и 1 без изменений в коде.
Я пытался использовать только один разделитель (запятые) и по-разному определять вывод токена strtok, а также переставлять порядок операторов в цикле while, где другие элементы строки предположительно разделены.Это несколько строк файла .csv, который я использую для проверки своего кода (test.csv).Это тот же формат, в котором NOAA предоставляет данные об осадках в виде .csv.
"STATION","NAME","DATE","PRCP","PRCP_ATTRIBUTES"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-06","0.65",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-12","0.46",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-13","0.09",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-14","0.01",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-15","0.60",",,N"
"US183459384","XYZ ABC 9.0 E, WA US","2019-01-16","1.93",",,N"
И моя попытка кода ниже.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 1024
int get_row(FILE *file, int row_num, char delim[]) {
int n_line = 0;
int field = 0;
char row[BUFFER_SIZE], *line[BUFFER_SIZE];
while (fgets(row, BUFFER_SIZE, file)) {
if (n_line == row_num) {
printf("Length of line %d is %ld elements!\n", n_line, strlen(row));
char* element = strtok(row, delim);
while (element != NULL) {
printf("%s\n", element);
line[field++] = strdup(element);
element = strtok(NULL, delim);
}
return 0;
} else {
n_line++;
}
printf("There is no row %d in the file you selected.\n", row_num);
return 0;
}
int main(int argc, char **argv) {
FILE *file;
char delim[] = ", \"";
file = fopen(”test.csv”, "r");
if (!file) {
printf("Error: could not open %s\n", file_name);
return -1;
}
printf("Reading file...\n");
get_row(file, 0, delim);
fclose(file);
return 0;
}
Я ожидаю, что результат покажет 5, норезультат 0 или 1 для всех строк и иногда 6.