2010-06-27 4 views
1

저는 개인 데이터베이스를 유지 관리하는 것에 관한 학교 프로젝트를하고 있습니다. 그러나 나의 교사는 연습을 설명하지 않았고, c로 코딩하는 방법이 아니라 이론 (데이터 구조 등)을 설명했다.구조체를 한꺼번에 파일로 작성하기

우리는 어디에서 일정한 양의 테이블, 색인 및 컨설턴트를 원했는가? 그리고 우리는 뒤 따르는 데이터 구조를 프로그래밍해야합니다.

보조 인덱스에 대한 데이터 및 b + 트리를 유지하기 위해 해시 테이블을 선택했습니다.


글쎄 b + 나무 나는 그들을 RAM에 보관할 수 있지만 해시 테이블을 하드 디스크에 유지할 수 있어야합니다. 그래서 fwrite() 함수를 사용하여 디스크에 보관합니다. 그러나 나는 문제를 발견했다. 단일 fwrite 명령으로 전체 버킷을 디스크에 쓰는 방법을 모르겠습니다. (필자가 제시 한 몇 가지 요구 사항 중 하나입니다.)


나는 구조

FILE * file; 
file = fopen ("HistoriasClinicas.bin" , "wb"); 
for(i=0;i<amountOfBuckets;i++) 
    fwrite (Bucket , getpagesize() ,1 , file); 
fclose (file); 

을 초기화가 코드 그리고 이것은 내 구조입니다

typedef struct Hist_clin_s{ 
struct 
{ 
    char codPaciente[7]; 
} X; 
struct 
{ 
    char codMedico[7]; 
    int fecha; 
    char Observacion[151]; 
} Y; 
int ptro; 
}Hist_Clin; 



typedef struct balde_s{ 
Hist_Clin *hcs; 
char *waste; //Waste to make the bucket reach the page size. 
}Bucket; 

내가 경험하고있어 문제는 내가하려고 할 때 양동이를 써라. 버킷 크기는 단지 8 (2 포인터의 cos)이지만 프로그램이 이미 시작된 후에는 그 값을 계산해야하기 때문에이 두 포인터 벡터 []를 만들 수 없습니다. 그리고 내가 읽은 것을 위해, 벡터의 크기를 조절하는 방법이 없습니다. 왜냐하면 그것들은 메모리의 위치를 ​​바꾸기 때문입니다.

내가 생각할 수있는 유일한 해결책은 전체 버킷을 char 배열 (버퍼 종류)에로드 한 다음 메모리에 씁니다.

아이디어가 있으십니까?

답변

3

Google이 더 많은 정보를 얻으려면 일반적으로 직렬화라고 부릅니다.

지금,이 경우, 첫 번째 구조체 :

typedef struct balde_s{ 
    Hist_Clin *hcs; 
    char *waste; //Waste to make the bucket reach the page size. 
}Bucket; 

2 포인터로 구성되어 있습니다. 포인터는 세이브로드 사이클 (save-load cycle) 동안 반드시 유효하지는 않습니다 (일반적으로 포인터가 될 수는 없습니다). 따라서 포인터를 저장할 필요가 없습니다. 대신, 두 구조체의 내용을 파일에 쓰고 싶을 것이다. 다행히도, 당신은 거의 이것을 쉽게 만들었습니다. 당신은 그래서 그냥 사용 (포인터)에서 주소를 알고 쓰기 N 바이트 (하나 개의 레코드의 크기가), 주어진 포인터에서 시작됩니다

fwrite((void*)something.hcs, sizeof(Hist_Clin), 1, file); 

.

+0

내가 무엇을 낭비 할 수 있습니까? 전체 아이디어는 전체 페이지 (이 경우에는 버킷)를 디스크에 쓰는 것이기 때문에. –

+0

무슨 뜻인지 확실하지 않습니다. 내가 준 코드 예제는 하나의 Hist_Clin 구조체와 거기에 들어있는 모든 데이터를 파일에 씁니다. 이전이나 이후의 데이터는 쓰여지지 않으므로 비교적 깨끗하고 낭비가없는 방법입니다. 파일을 페이징하거나 파일에 대한 메모리 기능을 사용하여 데이터에 액세스해야 할 수 있습니다. 보다 완전한 예를 보지 않고서 어떻게해야하는지 잘 모르겠습니다. – ssube

+0

구조체가 예약되어 있지 않습니까? ;) – Nyan

관련 문제