Я пытаюсь создать файловую систему FAT. Я понимаю основной принцип ее установки и использую такую структуру для каждой записи 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 */
};
По сути, я создаю файл размером 2 МБ, который будет моей файловой системой. Оттуда я буду писать и читать файлы в блоки по 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);
Будет ли это хранить структуру в байтах? Как мне читать из этого? У меня проблемы с пониманием того, что я получу, когда использую фред
Будет ли это хранить структуру в байтах?
&entry1
в (void*)
Как мне читать из этого?
fread((void*)&entry1,sizeof(entry1),1,file);
(но не забудьте флаг r fopen()
)
Настоящая проблема в вашем случае заключается в том, что структура вероятно будет дополнен компилятором, для эффективного доступа. так что вам придется использовать __attribute__((packed))
если вы используете GCC.
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);
утверждать потерпит неудачу, если чтение или запись не удалась (я не проверял это).
Других решений пока нет …