2012-03-18 2 views
0
struct ID3v2_header{ 
    char tag[3]; 
    char ver[2]; 
    char flag; 
    int size; 
}; 


ID3v2_header readID3v2_head(string file){ 
    char buf[10]; 
    ifstream infile(file.c_str(),ios::binary); 
    ID3v2_header head; 
    if(!infile || !infile.read(buf, 10)){ 
    cout<<"FAIL"<<endl; 
    infile.close(); 
    return head; 
    } 
    memcpy(&head,buf,10); 
    infile.close(); 
    return head; 

    } 

나는 방금 크기를 출력하고 달릴 때마다 바뀝니다. 어딘가에서 넘치고 있습니까?정수는 매 달리기마다 파일에서 읽습니까? 그 이유는 무엇입니까?

+0

그가 말한 내용. 또한, 동일한 설정으로 동일한 컴파일러를 사용하여 동일한 구조로 파일을 작성 했습니까? –

+1

돌아가서 [귀하의 다른 질문] (http://stackoverflow.com/questions/9696308/why-is-the-size-of-this-struct-12-and-not-10)에 대한 답변을 읽어야합니다. . – Blastfurnace

답변

3

sizeof(ID3v2_header) == 10이라는 가정을 확인해야합니다.

그런 다음 memcpy을 사용하는 대신 수동으로 구조체의 필드를 채워야합니다.

+0

sizeof 결과는 12이지만 바이트 정렬 때문인 것으로 생각했습니다. http://stackoverflow.com/questions/9696308/why-is-the-size-of-this-struct-12-and-not-10 – carboncomputed

+0

맞습니다. 불행히도 정렬은'size' 필드 앞에옵니다 (오프셋 6에 있기 때문에 오프셋 8로 푸시 될 가능성이 더 높습니다). – vhallac

+0

좋아요. 필자가 수동으로 각 필드를 통과한다면이 문제를 해결할 수 있을지 이해하고 있다고 생각합니다. – carboncomputed

0

파일은 바이트 스트림입니다. 파일에 데이터를 쓰기 전에이를 알려진 형식의 바이트 스트림으로 변환해야합니다. 파일에서 해당 데이터를 다시 읽을 때 해당 바이트 스트림의 형식을 메모리의 구조 형식으로 변환해야합니다.

memcpy(&head,buf,10); 

head가 메모리 형식이며 buf 파일 형식으로되어 있기 때문에이 작동하지 않습니다. 이 두 가지 형식간에 변환하려면 약간의 코드가 필요합니다.