2012-03-10 4 views
0
#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를 할 때 헤더 필드에 너무 많은 데이터를 넣는 것 같습니다. 각 struct 멤버를 거쳐 데이터를 복사해야합니까? 저는 또한 C++을 사용하고 있습니다. 그러나 이것은 "C"전략에 더 가깝습니다. C++을위한 더 좋은 방법이 있습니까?구조체에 char 배열을 복사 할 때 memcpy가 작동하지 않는 이유는 무엇입니까?

+2

char [3]에 '더 많은 데이터를 넣을 수 없습니다. 제로 종료가 아니기 때문에 너무 많이 읽을 수 있습니다. –

+1

당신의'ID3v1.header'는 null로 끝나지 않았을 가능성이 큽니다. '\ 0'까지 모든 것을 인쇄하고 있습니다. – lapk

+2

나는 당신의 버퍼와 버퍼의 이름을'buf'와'buffer'라고하지 말 것을 강력하게 제안합니다. 왜 하나의 이름을'buf'라고하고 다른 이름을'bufSize'라고하지 않습니까? 또는'buffer'와'bufferSize'? 이것은 혼란 스럽다! 또한, 복사하고자하는 모든 것이 ID3 태그이고 그 크기가'128'이라면,'128'을 상수로 대체하십시오 (예 :'ID3TAG_SIZE'). – hochl

답변

0

memcpy이하는 일은 문제가 될 가능성이 큽니다.

구조에 128 바이트를 복사합니다.

그런 다음 머리글을 인쇄 해보십시오. 첫 번째 문자, 두 번째, 세 번째를 인쇄하고 '\0' (문자열 종료 문자)을 찾을 때까지 인쇄를 계속합니다.

기본적으로 사물을 인쇄 할 때 헤더를 다른 문자 배열에 복사하고 종료 문자를 추가하거나 C++ 문자열에 복사하십시오.

3

'\ 0'문자가 누락되었거나 C 문자열을 인쇄 할 때 연산자 < <은 '\ 0'문자의 종료가 예상됩니다.

봅니다 :

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

이 헤더 필드에 세 문자를 인쇄 할 수 있습니다. 방어 적이기를 사용할 때 발생할 수있는

0

다른 문제가 :

  • 당신의 구조체 요소는 컴파일러에 의해 단어 경계에 정렬 할 수있다. 대부분의 컴파일러에는 사용할 정렬을 지정하기 위해 일부 pragma 또는 명령 줄 스위치가 있습니다.
  • 일부 CPU는 단어 경계에 단락이나 long을 저장해야합니다. 정렬되지 않은 주소에서 읽을 수 없으므로 정렬을 수정해도 도움이되지 않습니다.
  • char보다 큰 정수 (예 : short 또는 long)를 복사하는 경우 CPU 아키텍처에 따라 바이트 순서를 수정해야합니다.