gpt4 book ai didi

c - 这个 C 程序究竟是如何从这个二进制文件中读取数据的?

转载 作者:太空宇宙 更新时间:2023-11-04 03:51:50 24 4
gpt4 key购买 nike

我的教授向我们展示了一个程序示例,该程序读取粒子结构对象并打印每个粒子的详细信息。我了解 C 程序的工作原理,但对包含“结构对象”的“filea”二进制文件感到困惑。 C 程序中的数据如何自动分配给结构的值? filea 是二进制的,无法理解,所以我不确定它到底是如何工作的,当我问他时,我没有得到明确的答案。

程序如下:

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

struct vector{
float x;
float y;
float z;
};

struct particle {
float mass;
struct vector pos;
struct vector vel;
};

int main(int argc, int *argv[]) {
int cnt = 0;
int fd, nbytes;
struct particle *buf = (struct particle *)malloc(sizeof(struct particle));
fd = open("filea",O_RDONLY);

while ((nbytes = read(fd,buf,sizeof(struct particle))) > 0){
printf("Particle %d\n", cnt++);
printf("\tmass\t%.1f\n",buf->mass);
printf("\tpos\t(%.1f,%.1f,%.1f)\n",buf->pos.x,buf->pos.y,buf->pos.z);
printf("\tvel\t(%.1f,%.1f,%.1f)\n",buf->vel.x,buf->vel.y,buf->vel.z);
}
close(fd);
free(buf);

return 1;
}

幻灯片说“每个粒子都由结构表示:”

struct vector {
float x;
float y;
float z;
};

struct particle {
float mass;
struct vector pos;
struct vector vel;
};

最佳答案

它的工作原理是按照变量声明的顺序读取变量。particle 结构以 float 类型的名为 mass 的变量开始,因此首先读取的是总共 4 个字节(假设float 是 4 个字节)并分配给 mass。然后是一个名为 posstruct vector,它包含三个 float ,因此接下来将以相同的顺序读取它们。即,接下来的 4 个字节分配给 pos.x,接下来的 4 个字节分配给 pos.y,接下来的 4 个字节分配给 pos。 zvel 重复同样的事情。

这一切都在一个步骤中完成:读取大小为结构 particle 的整个 block 并将其复制到 buf,预计所有内容都会被复制到正确的位置。如果 struct particle 的声明没有改变,这会起作用,否则它不会。这种技术很快,但在很大程度上取决于结构的固定声明。而且,因为它使用的是二进制文件,所以它也依赖于机器。

关于c - 这个 C 程序究竟是如何从这个二进制文件中读取数据的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20087275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com