2016-09-10 4 views
1

C에서 구조체의 특정 멤버를 선택하여 인쇄하려고합니다. 나는 그러한 조작을 위해 제안 된 형식이 무엇일까요? 나는 내가 생각할 수있는 거의 모든 것을 시도했다. 구조체의 특정 chunk 멤버로 제한 할 수 없습니다.fread fseek 구조체 멤버가 C에만 있음

fseek(in, sizeof(d.contents.datas.chunk), SEEK_SET); 
fread(&ch, 1, 1, in); 
fprintf(out, "%02x", (int)(ch & 0x00FF)); 

모든 구조체 데이터 또는 하나의 문자 만 가져올 수 있습니다. 어떤 이유로 든 데이터도 올바르게 나오지 않습니다. 예를 들어 bytes은 실제 bytes이어야하지만 1으로 나옵니다. 분명히이 구조체의 데이터가 인쇄되는 방식에 실제로 잘못된 점이 있습니다. 빅 엔디안과 리틀 엔디안을 비교할 수 있을까요? 나는 접근하고있는 파일이 빅 엔디안이라는 것을 압니다.

struct chunkInfo 
{ 
    int chunkInformation; 
    int bytes; 

    union 
    { 
     struct 
     { 
      long size;  
      char chunk[1];  
     } datas;     
    } contents;     
}; 
+1

#pragma pack (엔디안 무시 중) –

+0

예를 들어 인텔 아키텍처에서 빅 엔디안으로 데이터를 수신하는 경우이를 변환해야합니다. 예를 들어 확인하십시오. 'hton'과'ntoh'. –

+0

일반적으로 네트워크 데이터 전송을 위해 json 또는 xml과 같은 ascii 형식을 사용하는 것이 가장 안전합니다. 보내는 기계가 64 비트 int를 사용하지만 사용자가 32 비트를 사용한다면 어떻게 될까요? 등 –

답변

2

을 당신은 파일에 잘못된 장소로 찾고 있습니다 다음과 같이

구조체 임 액세스입니다. 컴퓨터의 엔디안을 가정하면 파일의 엔디안과 동일, 다음이 작동합니다

fseek(in, long(&d.content.data.chunk[0] - &d), SEEK_SET); 
fread(&ch, 1, 1, in); 
fprintf(out, "%02x", (int)(ch & 0x00FF)); 

첫 번째 줄은 구조의 청크의 바이트 오프셋을 계산. 당연히 sizeof (청크)를 사용하고 있는데, 단지 1을 반환합니다.

엔디안이 다른 경우 구조에서 읽은 후 각 비 문자를 올바른 엔디안으로 변환해야합니다.

+1

오프셋 계산을 할 수있는 ''의 offsetof()도 있습니다. –

+0

@JonathanLeffler offsetoff를 지적 해 주셔서 감사합니다. –

+0

저는이 문제를 해결하기 위해 약 1 주일 동안 노력했습니다. 저는 C에서 조금 새로운 것이고 두 분 모두 저를 위해 해결해 주셨습니다. 나는 너에게 모자를 벗고, 많이 soooo 감사합니다 :) –

관련 문제