файловая система — Попытка создать файловую систему FAT на C ++?

Я пытаюсь создать файловую систему 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);

Будет ли это хранить структуру в байтах? Как мне читать из этого? У меня проблемы с пониманием того, что я получу, когда использую фред

0

Решение

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

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

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

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

(но не забудьте флаг r fopen())

Настоящая проблема в вашем случае заключается в том, что структура вероятно будет дополнен компилятором, для эффективного доступа. так что вам придется использовать __attribute__((packed)) если вы используете GCC.

[РЕДАКТИРОВАТЬ] Пример кода (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);

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]