You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ struct是否和类一样存储数据 单次调用Read_Header能否直接取变量值

问题解答

1. C++中struct与类的数据存储规则

C++里struct和class仅默认访问权限有差异:struct默认成员是public权限,class默认成员是private权限。除此之外二者的内存布局、数据存储逻辑完全一致:

  • 成员变量按照声明顺序分配内存空间,同时遵循编译器的内存对齐规则
  • 都支持成员函数、继承、多态等面向对象特性,用作纯数据存储场景时和类的行为没有任何区别

2. 需求实现可行性

从你贴的代码来看,Read_Header是CWav类的成员函数,RCD/FCD/MetaD等你定义的结构体变量都是CWav的成员变量,你的需求是完全可以实现的:
你只需要在main.cpp中实例化一个CWav类的对象,调用一次该对象的Read_Header方法且执行成功后,所有结构体成员都会被填充为读取到的WAV头信息,后续直接通过对象访问对应结构体的成员即可,不需要重复调用Read_Header,示例逻辑:

int main() {
    FILE* wav_file = fopen("test.wav", "rb");
    CWav wav_parser;
    // 调用一次即可完成所有头信息填充
    WORD buf_size = wav_parser.Read_Header(wav_file);
    // 后续直接读取值即可
    int32_t sample_rate = wav_parser.FCD.SamplesPerSec;
    uint32_t serial = wav_parser.MetaD.Serial;
    // 其他业务逻辑
    fclose(wav_file);
    return 0;
}

3. 现有代码的问题提醒

  • 内存泄漏:函数开头new了HeaderData数组,但全程没有使用也没有delete,建议直接删除无用的数组声明,或补充释放逻辑。
  • 结构体对齐问题:直接用fread读取整个结构体内容时,必须关闭编译器的自动内存对齐,否则结构体内部的填充字节会导致读取到的数据错位。可以在所有结构体声明前加#pragma pack(push, 1),声明结束后加#pragma pack(pop)强制1字节对齐。
  • 逻辑bug:读取META_DATA时你用了sizeof(FACT_CHUNCK)作为读取长度,二者的内存大小不一致,会导致META_DATA后面的成员读取错误,要改成sizeof(META_DATA)。
  • 效率问题:当前搜索chunk的逻辑每次偏移都用SEEK_SET从文件开头跳转,大文件读取时效率极低,建议每次匹配失败后用fseek(WAVF, -((int)sizeof(当前结构体) - 1), SEEK_CUR)回退,从当前位置继续搜索即可。

内容的提问来源于stack exchange,提问作者user16395253

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:24:03