2014-05-19 1 views
0

디스크에서 관리 할 데이터 블록을 빠르게 할당하는 방법을 찾으십시오. 저는 50 개의 구조체 블록을 할당하고 있습니다. 그리고 대부분의 메모리가 잘 할당되지만, 모든 것을 다시 읽을 때 비워야하는 필드의 일부에서 정크 메일이 반환됩니다. 이게 내가 공간을 잘못 할당 한 것 같아서 메모리에있는 어떤 쓰레기가 그곳에 유출되는 것을 허용합니다."공백"데이터 블록을 .dat 파일에 할당하는 가장 쉬운 방법

if ((fpBin = fopen(BINARYFILE, "w+b")) == NULL) 
{ 
    printf("Could not open binary file %s.\n", BINARYFILE); 
    return; 
} 
fwrite(fpBin, sizeof(struct student), 50, fpBin); //Write entire hash table to disk 

구조체 정의

typedef struct student 
{ 
    char firstName[20]; //name 
    char lastName[20]; 
    double amount; //amount owed 
    char stuID[5]; //4 digit code 
}student; 

내가 배운 방법이다, 그러나 나는 여전히 깨끗한 상태가되는 대신 내 데이터의 일부 정크납니다. 질문 : 어떻게 모든 필드를 비워 둡니까?

답변 :

student tempStu[50] = {0}; 
fwrite(tempStu, sizeof(struct student), BUCKETSIZE, fpBin); //Write entire hash table to disk 
+0

학생 구조체 정의를 보여주십시오. – OldProgrammer

+0

@OldProgrammer 그것은 무의미합니다. –

답변

3

에 fwrite (fpBin,를 sizeof (구조체 학생), 50, fpBin);

학생 구조가 아닌 파일 포인터를 디스크에 씁니다. 먼저 fpBin은 데이터에 대한 포인터 여야합니다. 이 데이터는 calloc이나 파일 범위에서 정의한 50 개의 학생 구조체 배열을 0으로 초기화 할 수 있지만 어딘가에 있어야합니다. 대신, fpBin 포인터에서 50 * sizeof (학생 구조) 바이트를 쓰고 있습니다. 이는 정의되지 않은 동작입니다. 액세스 위반으로 충돌하거나 디스크에 스팸을 쓸 것입니다. 그 쓰레기는 당신이 그것을 다시 읽을 때 얻는 것입니다.

또한 50과 같은 상수를 사용하는 것은 나쁜 습관입니다 ... 쓰는 학생 수를 보유하는 변수 (또는 명시 상수) 여야합니다.

사실, Linux 및 다른 POSIX 시스템에서 마지막 바이트를 쓰거나 (또는 ​​다른 큰 방법으로 파일을 크게하여) 0 블록을 디스크에 할당 할 수 있습니다.

+0

데이터를 보유하는 학생 구조체가 없으므로 구조체는 파일에서 데이터를 읽고 쓰도록 정의됩니다. – lloyd

+0

@lloyd 미안하지만 너는 말도 안돼. 파일의 데이터는 어딘가에서 메모리에서 읽고 쓰여야하므로 학생 구조체가 데이터를 보유해야합니다. 'fpBin'은 파일 디스크립터를 가리키며'struct student '를 가질 수 없다. 그것은 결코 fwrite의 첫 번째 논쟁이 될 필요가 없습니다 ... 만약 당신이 그것을 배웠다 고 생각한다면, 당신은 착각합니다. 귀하의 의견도 "디스크에 전체 해시 테이블을 작성"... 그 해시 테이블은 뭐죠? 그것은 분명히'fpBin'에 의해 지적되지 않습니다. 그래서, 당신은 대답을 원하십니까? 아니면 이미 가지고 있다고 확신합니까? 후자라면, 나는 너를 떠나게. –

+1

@lloyd 구조체에 데이터가 없더라도 50 개의'struct student' 또는 적어도 같은 크기의 것을 가리켜 야합니다. – tay10r

관련 문제