【发布时间】:2012-03-27 20:09:55
【问题描述】:
#define buffer 128
int main(){
char buf[buffer]="";
ifstream infile("/home/kevin/Music/test.mp3",ios::binary);
infile.seekg(-buffer,ios::end);
if(!infile || !infile.read(buf,buffer)){
cout<<"fail!"<<endl;
}
ID3v1 id3;
cout<<sizeof(id3)<<endl;
memcpy(&id3,buf,128);
cout<<id3.header<<endl;
}
struct ID3v1{
char header[3];
char title[30];
char artist[30];
char album[30];
char year[4];
char comment[28];
bool zerobyte;
bool track;
bool genre;
};
当我执行 memcpy 时,似乎将太多数据推送到标题字段中。我需要遍历每个结构成员并复制数据吗?我也在使用 c++,但这似乎更像是一种“C”策略。 c++有没有更好的方法?
【问题讨论】:
-
您不能将更多数据“推送”到 char[3] 中,您只能读取太多,因为它不是以零结尾的。
-
您的
ID3v1.header很可能不是以空值结尾的。在\0之前,您正在打印所有内容。 -
我强烈建议您不要将缓冲区和缓冲区大小命名为
buf和buffer。为什么不命名一个buf和另一个bufSize?还是buffer和bufferSize?这令人困惑!此外,如果您要复制的只是 ID3 标记且其大小为128,则将所有128替换为具有有意义名称的常量,例如ID3TAG_SIZE或其他。 -
要添加到 111111,您确定您在该 c 字符串中获得的数据是您想要的吗?
-
是的,我想就是这样,因为其余输入的数据是正确的。我确保我正确使用了 memcpy,我以前从未使用过它,但标签数据不是以零结尾的。
标签: c++ file-io struct memcpy id3