Я создал очень простую функцию "csvread" в C, которая будет читать из файлов CSV, как подразумевается.(В этом случае для тестирования я немного отредактировал его, чтобы я мог записать фиктивные данные в файл и затем прочитать его).Я создал структуру для хранения сложных данных.Однако мой файл psuedo-csv содержит только реальную часть данных, которые мне нужны.Я хотел бы сохранить эти данные в массиве "data.real".Тем не менее, я не могу получить правильный синтаксис.(Хотя, по общему признанию это, вероятно, больше проблема понимания указателей полностью, а не только синтаксиса).Мы будем благодарны за любую помощь!
В приведенном ниже коде я знаю, что проблема заключается в следующем вызове функции:
csvread("test.txt", &data->real);
Однако я пробовал несколько вариантов второго аргумента иэто единственное, что я могу придумать для этой компиляции.
Я получил свой код для работы, когда данные не являются структурой.Например, если данные были объявлены:
double data[10];
Итак, как вы можете (надеюсь) увидеть, у меня возникли проблемы с пониманием указателей на элементы структуры.
Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 10
typedef struct Complex
{
double real;
double imag;
}complex;
void csvread(char *filename, double *data_out);
int main(void)
{
complex *data;
csvread("test.txt", &data->real);
for(int i = 0; i<SIZE; i++)
{
printf("%f\n", data[i].real);
}
}
// This function reads csv files
void csvread(char *filename, double *data_out)
{
FILE *file;
char *no_commas; // character buffer to store strings without comma parse
double *buffer; // character data converted to double type
const char comma[2] = ",";
char *csv;
char *token;
int file_size;
int i = 0;
// Read CSV file
file = fopen(filename,"w+"); // change to "r" if read only
if(file == NULL)
{
printf("\n The file requested cannot be found.");
exit(1);
}
fprintf(file, "%s", "1.18493,0.68594,-7.65962,9.84941,10.34054,7.86571,0.04500,11.49505,-8.49410,-0.54901");
fseek(file, 0, SEEK_SET); // return to beginning of the file
// Find the file size in bytes
fseek(file, 0, SEEK_END); // go to end of file
file_size = ftell(file);
fseek(file, 0, SEEK_SET); // return to beginning of file
// Allocate buffer memory
no_commas = malloc((file_size) * sizeof(char));
buffer = malloc((file_size) * sizeof(double));
if (no_commas == NULL || buffer == NULL)
{
printf("Failed to allocate memory when reading %s.\n\n", filename);
exit(1);
}
while ((csv = fgets(no_commas, (file_size + 1), file)) != NULL) // fgets is used as file has no newline characters
{
// Remove Commas from string
token = strtok(csv, comma);
while (token != NULL)
{
//printf("%s\n", token);
buffer[i] = atof(strdup(token));
token = strtok(NULL, comma);
//printf("%f\n", buffer[i]);
i++;
}
}
data_out = buffer;
fclose(file);
free(no_commas);
free(buffer);
}
Вывод:
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
Ожидаемый вывод:
1.18493
0.68594
-7.65962
9.84941
10.34054
7.86571
0.04500
11.49505
-8.49410
-0.54901
РЕДАКТИРОВАНИЕ Спасибо всем за ваши комментарии и помощь!Я отметил ответ Джонни Моппа как наиболее полезный.Этот вопрос развился в большей степени о выделении памяти, чем предполагалось, что оказалось очень информативным и полезным.