试图用C ++创建FAT文件系统?

时间:2013-05-06 00:28:26

标签: c++ filesystems fat

我正在尝试创建一个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 MB的文件来充当我的文件系统。从那里我将写入和读取文件到每个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 个答案:

答案 0 :(得分:1)

是否以字节为单位存储结构?

  • 是肯定的。在C ++中,您需要明确地将&entry1强制转换为(void*)

我如何阅读?

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

(但不要忘记fopen())的“r”标志

您的案例中的真正问题是结构will probably be padded by the compiler,以实现高效访问。因此,如果您使用的是gcc,则必须使用__attribute__((packed))

[编辑] 代码示例(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将失败(我没有检查)。