2014-06-06 5 views
0
struct good { 

int ID; 
char name[20]; 
int quantity; 
float cost; 
} 

struct good article; 

fseek(hw2, f*sizeof(struct good) + sizeof(article.ID) + sizeof(article.name), SEEK_SET); 

매개 변수 sizeof() + sizeof() + sizeof()의 값이 예상 값을 산출합니까? 수량 필드? 이 파일 위치 제어 명령문을 사용하여 필드에 쓰려고 할 때 레코드를 다시 읽으면 올바르게 작성되지 않은 것입니다.이진 파일 처리 - 구조체 내의 특정 필드에 대한 fseek()

나는 이것이 패딩과 메모리 정렬에 관한 것이라고 생각합니다.

P.S :

선명한 코드 샘플 :

struct good { 
short int ID; 
char name[20]; 
int quantity = 0; 
float cost = 0; 
}; 
struct good article; 
article.ID = 2;     
article.name = "Maisara";  //These two fields are already filled, I want to write only to the coming field 
article.quantity = 7; 

fseek(hw2, f*sizeof(struct good) + sizeof(article.ID) + sizeof(article.name), SEEK_SET); 
fwrite(&article.quantity, sizeof(article.quantity), 1, hw2); 
+0

무엇을 읽고 쓰려고합니까? 두 가지 모두에 대한 코드를 게시 할 수 있습니까? –

+3

['offsetof'] (http://en.wikipedia.org/wiki/Offsetof)가 필요합니다. –

+0

왜 여기 fseek하고 싶니? 포인터를 증가시켜 포인터를 간단하게 점프 할 수 있습니까? – Abhineet

답변

0

읽거나 당신의 구조체를 쓰고, 여기에 서식하지 않습니다. 즉 :

write (fd, (void*) article, sizeof(article)); 

당신은 디스크의 공간을 낭비하고 __packed 키워드와 구조체 만들 수있는 구조체 (또는 이와 유사한를, 컴파일러 특정)을 작성하는 경우 휴대 성을 증가 싶지 않아 그 컴파일러를 지시하는 경우 메모리 정렬 측면에서 구조체를 최적화하지 않습니다.

구조체를 mmap 할 수도 있습니다.

+0

대단히 감사합니다 :) –