我正在尝试创建一个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时,我无法理解我会得到什么
答案 0 :(得分:1)
是否以字节为单位存储结构?
&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将失败(我没有检查)。