繁体   English   中英

如何从文件中读取大量数据到 C 中的结构或结构数组的指针

[英]How can I read a large set of data from a file into either a pointer to a structure or array of a structure in C

我有一个具有已知密钥的数据文件,也就是说,它有许多具有相同属性的条目(设备),并且我在代码中有这个结构来捕获它。

struct deviceData{
  int id;
  char serial[10];
  float temperature;
  float speed; 
  long timestamp; 
}

struct deviceData fileItems;

ID 为 4 个字节,序列码为 10 个字节,温度和速度为 4 个字节,时间戳为 8 个字节。 总共 30 个字节。

我想要实现的是能够阅读所有这些条目并以我能最快的方式运行计算。

我最初想做的是简单地创建一个巨大的数组来捕获所有条目,但这会导致错误。
其次,我想到了从指向该结构的指针分配空间并将整个文件读取到该结构。 这在执行中有效,但我在处理数据时遇到了麻烦。 可能是我在基本面方面的差距。

我目前正在查看的方式是循环读取我使用 fread() 捕获单个条目的读数,对其进行处理,然后移动文件以将下一个条目放入缓冲区。 像这样的东西:

fread(&fileItems, 30, 1, filename)

但发生的情况是,当我查看实际读取的内容时,我看到 ID 和序列码已正确读取,但以下数据点是垃圾。 读了一点关于它我遇到了一些关于填充的东西,我不完全理解,但修复似乎是让我的 char 数组 100 这似乎适用于第一个条目,但我怀疑它会导致后续读数出现问题,因为它是抛开我的计算。

我在这里有点摸不着头脑,因为我尝试的每一个策略似乎都有一些奇怪的东西。 如果我至少可以指出正确的方向,我至少会知道我正在努力做正确的事情。

如果您只是想逐条记录处理一组数据,您可能可以利用定义结构的方法,然后将文件中的数据读取到结构中,然后处理数据。 为了使事情保持一致,将数据作为结构存储在二进制文件中是有意义的。 以下是创建一些示例数据的代码片段,然后按照您的项目精神对其进行处理。

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

struct deviceData{
  int id;
  char serial[10];
  float temperature;
  float speed;
  long timestamp;
};

struct deviceData fileItems;

void create_data(char * file_name)
{
    FILE* fp = fopen(file_name, "wb");
    if(!fp)
    {
        printf("\n\tFile open error\n");
        return;
    }

    for (int i = 0; i < 10; i++)
    {
        fileItems.id = i + 20000 + i * 3;
        sprintf(fileItems.serial, "SN%d", fileItems.id);
        fileItems.temperature = 166.0 + i;
        fileItems.speed = 2400.0;
        fileItems.timestamp = 20220830;
        fwrite(&fileItems, sizeof(struct deviceData), 1, fp);
    }

    fclose(fp);
}

void read_data(char *file_name)
{
    FILE* fp = fopen(file_name, "rb");

    if(!fp)
    {
        printf("\n\tFile open error\n");
        return;
    }

    while(fread(&fileItems, sizeof(struct deviceData), 1, fp))
    {
        printf("ID. . .  . . . .: %d\n", fileItems.id);
        printf("Serial number. .: %s\n", fileItems.serial);
        printf("Temparature. . .: %f\n", fileItems.temperature);
        printf("Speed. . . . . .: %f\n", fileItems.speed);
        printf("Timestamp. . . .: %ld\n", fileItems.timestamp);
    }
}

int main()
{
    create_data("device.dat");      /* Create some sample data to be read      */
    read_data("device.dat");        /* Read and print the data to the terminal */
    return 0;
}

设备数据的存储可能会发生在其他一些监控程序中,但是对于这个片段,包含一个一次性的 function 以生成一些要处理的数据。

分析该代码,看看它是否符合您的项目精神。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM