c - 使用 csv 文件的输入填充结构体数组

标签 c arrays file struct

我必须读取这种csv文件

565;4;6;8;11/10/2017;11:30
756;5;9;1;12/12/2017;10:40
765;-8;-2;-1;06/01/2018;23:23

我需要将这些数据放入这个结构中

typedef struct  {
int cod_event;
int x;
int y;
int z;
int day;
int month;
int year;
int hour;
int minute;
}Eventi_astronomici;

这是用适当的维度初始化和重新分配的数组。 所以我知道文件的尺寸,我只需要用这些整数填充这个数组

    Eventi_astronomici *all_data_astro;
all_data_astro = calloc(  200  , sizeof(Eventi_astronomici));

if (all_data_astro == NULL)
{
   printf("Malloc failed1!\n");
   return -1;
}
char c;
for (c = getc(file_ptr); c != EOF; c = getc(file_ptr))
    if (c == '\n') // Increment count if this character is newline 
        count = count + 1; 



printf("%d\n", count);

all_data_astro =  realloc( all_data_astro , count * sizeof( Eventi_astronomici));

if (all_data_astro == NULL)
{
   printf("Realloc failed!\n");
   return -1;
}

这就是我尝试从文件中获取输入的方法,在此之前我倒回文件 ptr。然后我打印我的数组以查看 fscanf 是否有效

for( i = 0 ; i < count ; i++){
    fscanf(file_ptr , "%d;%d;%d;%d;%d/%d/%d;%d:%d" ,&all_data_astro[i].cod_event, &all_data_astro[i].x ,
        &all_data_astro[i].y,&all_data_astro[i].z,&all_data_astro[i].day ,
            &all_data_astro[i].month,&all_data_astro[i].year,&all_data_astro[i].hour,&all_data_astro[i].minute );
}



for (i = 0; i < count; i++) {
        printf("%d,%d,%d,%d,%d/%d/%d,%d:%d\n",all_data_astro[i].cod_event, all_data_astro[i].x ,
            all_data_astro[i].y,all_data_astro[i].z,all_data_astro[i].day ,
                all_data_astro[i].month,all_data_astro[i].year,all_data_astro[i].hour,all_data_astro[i].minute);

    }

奇怪的是,即使 fscanf 不起作用,我也没有得到任何打印。因此,程序可能在到达下一个 for 循环之前就阻塞了,也许我需要在 if 中检查 fscanf 返回值?

最佳答案

另一种方法是使用 fgets 读取一行,为每一行重新分配并使用 sscanf 解析该行。对于大量行,可以对行 block 进行重新分配,并跟踪分配的行数和使用的行。当使用的行数等于分配的行数时再次分配。

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

typedef struct  {
    int cod_event;
    int x;
    int y;
    int z;
    int day;
    int month;
    int year;
    int hour;
    int minute;
}Eventi_astronomici;

int main ( void) {
    char line[100] = "";
    int count = 0;
    int each = 0;
    FILE *pf = NULL;
    Eventi_astronomici *all_data_astro = NULL;
    Eventi_astronomici *temp = NULL;

    if ( NULL == ( pf = fopen ( "astrodata.txt", "r"))) {
        fprintf ( stderr, "could not open file\n");
        return 0;
    }

    while ( fgets ( line, sizeof line, pf)) {
        if ( NULL == ( temp = realloc ( all_data_astro, sizeof ( *all_data_astro) * (count + 1)))) {
            fprintf ( stderr, "realloc problem\n");
            fclose ( pf);
            free ( all_data_astro);
            return 0;
        }
        all_data_astro = temp;
        if ( 9 == sscanf ( line, "%d;%d;%d;%d;%d/%d/%d;%d:%d"
        , &all_data_astro[count].cod_event
        , &all_data_astro[count].x
        , &all_data_astro[count].y
        , &all_data_astro[count].z
        , &all_data_astro[count].day
        , &all_data_astro[count].month
        , &all_data_astro[count].year
        , &all_data_astro[count].hour
        , &all_data_astro[count].minute )) {
            count++;
        }
        else {
            printf ( "problem with record\n");
        }
    }

    fclose ( pf);

    for ( each = 0; each < count; ++each) {
        printf("%d,%d,%d,%d,%d/%d/%d,%d:%d\n"
        , all_data_astro[each].cod_event
        , all_data_astro[each].x
        , all_data_astro[each].y
        , all_data_astro[each].z
        , all_data_astro[each].day
        , all_data_astro[each].month
        , all_data_astro[each].year
        , all_data_astro[each].hour
        , all_data_astro[each].minute);
    }

    free ( all_data_astro);

    return 0;
}

关于c - 使用 csv 文件的输入填充结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53693418/

相关文章:

c - 打印纸将邮票填满方形纸,没有任何重叠

c - 如何通过ffmpeg将mp3解码为pcm

java - 为什么方法不能返回多个值

javascript - 减少单个数组求和切片

c++ - 函数和数组有问题

c - 为什么 fread 读取的整数不正确?

c - C语言中scanf处 "%d"和 "%d "的区别

java - java中的二维字符串数组排序

java - 如何从 JAVA 字符串(文件路径)发送到 C?

Php Curl 发送文件和数组数据