为什么在将char数组复制到struct中时memcpy不起作用?

时间:2012-03-10 20:29:37

标签: c++ file-io struct memcpy id3

#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 ++有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

如所有注释中所述(缺少'\ 0'字符,或者在打印C-Strings时,运算符&lt;&lt;期望字符序列'\ 0'终止。)

尝试:

std::cout << std::string(id3.header, id3.header+3) << std::endl;

这将在标题字段中打印三个字符。

答案 1 :(得分:0)

问题很可能在于memcpy做了它做的事情。

它将128字节复制到您的结构中。

然后你尝试打印标题。它打印第一个字符,第二个,第三个..并继续打印,直到找到'\0'(字符串终止字符)。

基本上,当打印出来时,将标题复制到另一个char数组并附加终止字符(或复制到c ++字符串)。

答案 2 :(得分:0)

使用memcpy时可能遇到的其他问题:

  • 您的struct元素可能会被编译器与字边界对齐。 大多数编译器都有一些pragma或命令行开关来指定要使用的对齐方式。
  • 某些cpu需要将short或long存储在字边界上,在这种情况下修改对齐对你没有帮助,因为你将无法从未对齐的地址读取。
  • 如果复制大于char的整数(如short或long),则必须确保根据cpu架构更正字节顺序。