carboncomputed
carboncomputed

Reputation: 1620

Why doesn't memcpy work when copying a char array into a struct?

#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;

};

When I do the memcpy, it seems to be pushing too much data into the header field. Do I need to go through each of the structs members and copy the data in? I'm also using c++, but this seems more of a "C" strategy. Is there a better way for c++?

Upvotes: 0

Views: 3861

Answers (3)

Willem Hengeveld
Willem Hengeveld

Reputation: 2776

other problems you may encounter when using memcpy:

  • your struct elements may be align to word boundaries by the compiler. most compilers have some pragma or commandline switch to specify the alignment to use.
  • some cpu's require shorts or longs to be stored on word boundaries, in that case modifying the alignment will not help you, as you will not be able to read from the unaligned addresses.
  • if you copy integers larger than char ( like short, or long ) you have to make sure to correct the byte order depending on your cpu architecture.

Upvotes: 0

Loki Astari
Loki Astari

Reputation: 264391

As noted in all the comments (you are missing the '\0' character, or when printing C-Strings the operator<< is expecting the sequence of characters to be '\0' terminated).

Try:

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

This will print the three characters in the header field.

Upvotes: 3

Milan
Milan

Reputation: 15849

The problem is most likely in that the memcpy does what it does.

It copies the 128bytes into your structure.

Then you try to print out the header. It prints the 1st character, 2nd, 3rd.. and continues to print until it finds the '\0' (string termination character).

Basically, when printing things out, copy the header to another char array and append the termination character (or copy to an c++ string).

Upvotes: 0

Related Questions