Я долго боролся с этой программой.Цель состоит в том, чтобы прочитать простой файл .csv без использования libcsv.После исследования и программирования я придумал эту реализацию.Это почти там, но это не сработает только в конце.
Я подозреваю, что ошибка в строке с str2uint64_t(ptr, &int64_converted, &error);
, но я не могу понять, почему.
В случае, если это может помочь,Я адаптировал эту реализацию из той, которую нашел на этой веб-странице: https://cboard.cprogramming.com/c-programming/47105-how-read-csv-file.html
Кстати, программу можно скомпилировать и вызвать как: gcc -o q q.c && ./q file.csv
Гдеfile.csv
может быть что-то вроде:
0,10,20,300,905
55,18,8,253,65
0,18,265,293,98
23,18,28,6675,86
677,20,28,293,100
Реализация:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <errno.h>
void str2uint64_t(const char *str, uint64_t *intConverted, int *error)
{
// Converts string to uint64_t
*intConverted = 0;
*error = 0;
const char *s = str;
int sign = *s;
char *end;
errno = 0;
const uint64_t sl = strtoull(str, &end, 10);
if (end == str)
{
//fprintf(stderr, "%s: not a decimal number\n", str);
*error = 1;
}
else if ('\0' != *end)
{
//fprintf(stderr, "%s: extra characters at end of input: %s\n", str, end);
*error = 1;
}
else if (ERANGE == errno)
{
//fprintf(stderr, "%s out of range of type uint64_t\n", str);
*error = 1;
}
else if (sign == '-')
{
//fprintf(stderr, "%s negative\n", 0);
//errno = ERANGE;
*error = 1;
}
//return sl;
*intConverted = sl;
}
void *newMatrix(size_t rows, size_t cols)
{
return malloc (sizeof(uint64_t[rows][cols]));
}
void importMatrix(char CSVFilePath[], size_t rows, size_t cols, uint64_t matrix[rows][cols])
{
size_t i, j;
uint64_t int64_converted;
int error = 0;
FILE *CSVfile = fopen(CSVFilePath, "r");
if (CSVfile == NULL)
{
perror("Error");
exit(EXIT_FAILURE);
}
char buffer[BUFSIZ], *ptr;
for (i = 0; fgets(buffer, sizeof buffer, CSVfile); ++i)
{
for (j = 0, ptr = buffer; j < rows; ++j, ++ptr)
{
str2uint64_t(ptr, &int64_converted, &error);
if (error == 0)
{
// From https://cboard.cprogramming.com/c-programming/47105-how-read-csv-file.html >> array[i][j] = (int)strtol(ptr, &ptr, 10);
matrix[i][j] = int64_converted;
}
else
{
printf("Failed to import matrix\n");
exit(0);
}
}
}
fclose(CSVfile);
putchar('\n');
}
int main(int argc, char *argv[])
{
if (argc < 2)
{
fprintf(stderr, "Usage: ./<program> <file.csv>\n");
exit(EXIT_FAILURE);
}
size_t rows = 5;
size_t cols = rows;
uint64_t (*matrix)[rows] = newMatrix(rows, cols);
importMatrix(argv[1], rows, cols, matrix[rows][cols]);
//////////////////////////////
return 0;
}