2013-05-06 2 views
0

Я пытаюсь создать файловую систему FAT я понимаю, основной принцип того, как его предполагается установить, и я использую на структуру, как это для каждой записи FATПытается создать файловую систему FAT в C++?

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 */ 
}; 

Я по существу создавая 2 МБ файла для работы в качестве файловой системы. Оттуда я буду писать и читать файлы в блоках по 512 байт каждый. Мой вопрос, как я могу написать структуру в файл? Позволяет ли мне это сделать? Например:

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

Будет ли это хранить структуру в байтах?

  • Да. в C++ вам нужно будет явно привести к &entry1(void*)

Как читать из этого?

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

(но не забывайте, "г" флаг в fopen())

Реальная проблема в вашем случае является то, что структура will probably be padded by the compiler, для эффективного доступа. поэтому вам нужно будет использовать __attribute__((packed)), если вы используете gcc.

[EDIT] образец кода (C, а не C++):

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) 

Теперь вы можете проверить, что вы читаете, что вы написали ранее:

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

assert потерпит неудачу, если читать или писать не удалось (я не проверял для этого).

+0

Спасибо, но что делает fread ((void *) & entry1, sizeof (entry1), 1, file); вернуть? Структуру? Я думаю, это меня пугает. – user2134127

+0

[fread] (http://www.cplusplus.com/reference/cstdio/fread/) возвращает «Общее число элементов, успешно прочитанных». который может быть меньше, чем вы имели в виду. Он будет заполнять «entry1» фактическими данными. – Elazar

+0

О, я понимаю, теперь спасибо! – user2134127

Смежные вопросы