2013-05-06 4 views
0

는 내가이 설정되어 방법의 기본 원리를 이해 FAT 파일 시스템을 만들려고 그리고 난 각 FAT 엔트리C++에서 FAT 파일 시스템을 만들려고합니까?

struct FATEntry 
{ 
    char  name[20]; /* Name of file */ 
    uint32_t pos;  /* Position of file on disk (sector, block, something else) */ 
    uint32_t size;  /* Size in bytes of file */ 
    uint32_t mtime;  /* Time of last modification */ 
}; 

나는 본질적으로 만드는거야이 같은 구조체를 사용하고 있습니다 2MB 파일이 내 파일 시스템으로 작동합니다. 거기서부터 파일을 512 바이트 단위로 읽고 쓸 것입니다. 내 질문에 어떻게 구조체를 파일에 쓸 수 있습니까? fwrite가이 작업을 수행 할 수 있습니까? 예 :

struct FATEntry entry1; 
strcpy(entry1.name, "abc"); 
entry1.pos = 3; 
entry1.size = 10; 
entry1.mtime = 100; 
cout << entry1.name; 

file = fopen("filesys", "w"); 
fwrite(&entry1,sizeof(entry1),1,file); 
fclose(file); 

구조체를 바이트 단위로 저장 하시겠습니까? 어떻게 읽습니까? 내가 fread를 사용할 때 내가 무엇을 되 찾을 것인지 이해하는데 어려움을 겪고있다.

답변

1

struct를 바이트 단위로 저장하겠습니까?

  • 예. C++에서는 명시 적으로 캐스팅해야합니다 (void*)

어떻게 읽어야합니까?

  • fread((void*)&entry1,sizeof(entry1),1,file);

(그러나 fopen()에 "R"플래그를 잊지 마세요) 귀하의 경우

진짜 문제는 효율적인 액세스를위한 구조체 will probably be padded by the compiler. 따라서 gcc를 사용하는 경우 __attribute__((packed))을 사용해야합니다.

[편집] 코드 예제 (C 아니라 C++) :

assert(memcmp(&entry1, &entry2, sizeof(struct FATEntry))==0); 

assert이 경우 실패합니다

struct FATEntry entry1 { "abc", 3, 10, 100 }; 
FILE* file1 = fopen("filesys", "wb"); 
fwrite(&entry1, sizeof(struct FATEntry), 1, file1); 
fclose(file1) 

struct FATEntry entry2 { "", 0, 0, 0 }; 
FILE* file2 = fopen("filesys", "rb"); 
fread(&entry2, sizeof(struct FATEntry), 1, file2; 
fclose(file2) 

이제 당신이 이전에 쓴 것을 읽을 것을 확인할 수 있습니다 읽거나 쓰기가 성공하지 못했습니다 (나는 이것을 확인하지 않았습니다).

+0

감사합니다.하지만 fread ((void *) 및 entry1, sizeof (entry1), 1, file)은 무엇입니까? 반환? 구조체? 나는 그것이 나를 혼란스럽게 만드는 것이라고 생각한다. – user2134127

+0

[fread] (http://www.cplusplus.com/reference/cstdio/fread/)는 "성공적으로 읽은 총 요소 수"를 반환합니다. 당신이 의미했던 것보다 적을 수도 있습니다. 실제 데이터로'entry1'을 채 웁니다. – Elazar

+0

오, 감사합니다. – user2134127