2017-10-01 8 views
0

bitfield와 unsigned char * (나중에 할당 됨)가있는 사용자 정의 구조를 테스트하고 있습니다. 나는 진수의 파일 내부에이 구조체를 저장하려고 할 때bitfields와 char이있는 fwrite/fread 구조체 *

struct test { 
    unsigned int field1 : 1; 
    unsigned int field2 : 15; 
    unsigned int field3 : 32; 
    unsigned int dataLength : 16; 
    unsigned char * data; 
} 

문제는 다음과 같습니다

는 구조입니다. 예를 들어

:

그래서
int readAnStructFromFile(struct test *ptr, FILE *f) { 
    // probably wrong 
    fread(ptr->field1, sizeof(unsigned int), 1, f); 
} 

, 내가 쓸 수있는 방법/이런 구조체를 읽어

int writeStruct(struct test *ptr, FILE *f) { 

    // for data, suppose I know the length by dataLength : 
    // this throw me : cannot take adress of bit field 
    int count; 
    count = fwrite(&(ptr->field2), sizeof(unsigned int), 1, f); 

    // this throw me : makes pointer to integer without a cast 
    count = fwrite(ptr->field2, sizeof(unsigned int), 1, f); 

    // same for length 
    count = fwrite(htons(ptr->data) , ptr->dataLength, 1,f);  

    // so , how to do that ? 
} 

같은 문제가 FREAD에 간다? 이러한 비트 필드가 아니었다면 당신의 도움 FREAD에 대한

PS에 대한

덕분에,이 일할 수 : How to fread() structs?

+1

field1''에 대한 비트 필드를 사용하고 표준 비트 아니기 때문에'field2'이, 이해하는 것 같지만 -widths를 사용하면'field3'과'dataLenght'에 대해서는 의미가 없습니다. 각각'uint32_t'와'uint16_t'를 사용할 수 있습니다. 그리고 메모리가 부족한 시스템에 있지 않다면 다른 데이터 구조 (네트워크 패킷, 데이터 패킷, 네트워크 패킷)와 일치시키지 않는 한 비트 필드가 필요하지 않으며 (종종 'data_type' 디스크상의 구조 등). –

+0

몇 가지 경우를 처리하는 예입니다 :). 사용자 정의 네트워크 패킷을 만들려고 시도했습니다 ^^ – jy95

+0

파일을 이진 형식으로 저장해야합니까? 왜 'son슨'과 같은 것이 아닌가? 'fscanf'와'fprintf'를 사용하여 일관된 파일 텍스트 구조로 인해 다시 읽는 것이 더 쉬울 것입니다. – AmeyaVS

답변

1

는 비트 필드의 주소를 볼 수있는 방법이 없습니다. 이를 처리하는 일반적인 방법은 읽기/쓰기 측면에서 임시 변수를 사용하거나 전체 구조체를 단일 엔티티로 저장하는 것입니다. 임시로 그 모습 바르 다음

int count; 
int field2 = ptr->field2; 
count = fwrite(&field2, sizeof(unsigned int), 1, f); 
... 
int field1; 
fread(&field1, sizeof(unsigned int), 1, f); 
ptr->field1 = field1; 

또는 전체 구조체에 대한

:

count = fwrite(ptr, sizeof(struct test), 1, f); 
+0

감사합니다. 나는 당신의 첫 번째 아이디어를 테스트 할 것입니다. 당신은 전체 struct fwrite가 내부 포인터 때문에 작동하지 않을 것이라고 생각합니까? – jy95

+0

귀하의 경우 전체 구조 쓰기가 작동하지 않습니다. 데이터 자체를 쓰지 않고, 의미가없는 데이터 포인터 만 씁니다. – Serge

+0

헤더와 데이터의 두 부분으로 나누는 것이 좋습니다. 처음으로 하나만 실패 했으므로 전체적으로 – Serge