【问题标题】:Binary File Processing - fseek() to a certain field inside a struct二进制文件处理 - fseek() 到结构内的某个字段
【发布时间】:2014-07-27 18:50:40
【问题描述】:
struct good {

int ID;
char name[20];
int quantity;
float cost;
}

struct good article;

fseek(hw2, f*sizeof(struct good) + sizeof(article.ID) + sizeof(article.name), SEEK_SET);

参数 sizeof() + sizeof() + sizeof() 的值是否产生预期值:数量字段中第一个字节的索引?当我尝试使用这个文件位置控制语句写入字段时,读回记录,我发现它没有正确写入。

我认为这都是关于填充和内存对齐的。

附:

更清晰的代码示例:

struct good {
short int ID;
char name[20];
int quantity = 0;
float cost = 0;
};
struct good article;
article.ID = 2;                 
article.name = "Maisara";       //These two fields are already filled, I want to write only to the coming field
article.quantity = 7;   

fseek(hw2, f*sizeof(struct good) + sizeof(article.ID) + sizeof(article.name), SEEK_SET);
fwrite(&article.quantity, sizeof(article.quantity), 1, hw2);

【问题讨论】:

  • 你想读什么和写什么?你能发布两者的代码吗?
  • 你想要offsetof
  • 为什么要在这里fseek?你可以简单地通过递增指针来跳转?
  • 这里有很多不清楚的疑问:: "hw2" 指向哪里? “f * sizeof(struct good)”中的“f”是什么?
  • 1. hw2 指向一个以 rb+ 模式打开的文件。

标签: c file-io padding memory-alignment fseek


【解决方案1】:

当你读或写出你的结构体时,不要对其进行任何格式化。即:

write ( fd, (void*) article, sizeof(article) );

如果您不想在写出结构时浪费磁盘空间并提高可移植性,您可以使用 __packed 关键字(或类似的,特定于编译器的关键字)创建结构,这将指示编译器不优化结构内存对齐方面的术语。

你也可以映射你的结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多