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
相关产品推荐
相关产品推荐

