gpt4 book ai didi

c++ - 在 C++ 中使用 fread()、fwrite() 和 malloc

转载 作者:行者123 更新时间:2023-11-30 04:29:44 24 4
gpt4 key购买 nike

我在使用 C++ 中的 fread 和 fwrite 函数时遇到了惊人的困难。

该项目正在编写一个基本的 FAT16 文件系统,我们只能使用 fread 和 fwrite。

当我最初编写文件时,我的代码如下所示:

        directoryTable = (directoryEntry *)malloc(clusterSize);

for (int i = 0; i < bootRecord[0] / 128 ; ++i){

directoryEntry * newEntry = (directoryEntry *)malloc(sizeof(directoryEntry));
newEntry->name = (char *)malloc(112);
newEntry->name[0] = 'a'
write(1, &(newEntry->name[1]), 1);
newEntry->size = 0;
newEntry->type = 0;
newEntry->creation = 0x0000;
newEntry->index = 0;

fwrite(newEntry->name, 112, 1, fp);
fwrite(&newEntry->size, sizeof(int), 1, fp);
fwrite(&newEntry->type, sizeof(int), 1, fp);
fwrite(&newEntry->creation, sizeof(int), 1, fp);
fwrite(&newEntry->index, sizeof(int), 1, fp);

directoryTable[i] = *newEntry;
}

当我将 directoryEntry->name 的第一个字符分配给 'a' 时,我的意图实际上是将值分配给它 0x00 以便稍后检查它是否为空。我只是将权利用于调试目的。我的问题是当我阅读它时,我什么也得不到。

当我阅读我的代码时,它看起来像这样:

        fseek(fp, clusterSize * root, SEEK_SET);

for(int i = 0; i < clusterSize / 128; ++i){
directoryEntry * newEntry = (directoryEntry *) malloc(128);
newEntry->name = (char *) malloc(112);
fread(newEntry->name, 112, 1, fp);
write(1, newEntry->name[0],1);
fread(&newEntry->size, sizeof(int), 1, fp);
fread(&newEntry->type, sizeof(int), 1, fp);
fread(&newEntry->creation, sizeof(int), 1, fp);
fread(&newEntry->index, sizeof(int), 1, fp);
directoryTable[i] = *newEntry;
}

需要注意的是,clusterSize和root的值也是用类似的方法读入的。我已经检查过,它们的值在两种情况下都是准确的。由于我能够毫无问题地阅读这些内容,所以我不知道为什么我现在遇到这么大的问题。我觉得我对 malloc 的使用不太正确,我以前从未使用过它。

此外,如果需要,这里是 directoryTable 的定义:

     typedef struct{
char * name;
unsigned int index;
unsigned int size;
unsigned int type;
unsigned int creation;
} directoryEntry;

谢谢你们抽出时间,如果你们需要我澄清任何事情,我很乐意。

最佳答案

我看到了很多小问题:

  1. 您没有将分配给名称的内存清零。试试 memset(newentry->name, 0, 112);
  2. 当你写的时候,你写的是 name 数组的第二个元素(索引 1),当你读它的时候,你写的是 name 数组的第一个元素(索引 0): write(1, &(newEntry->name[ 1]), 1); vs. write(1, newEntry->name[0],1);
  3. 此外,在第一次写入中你获取了它的地址,而在第二次写入中你没有,所以看起来第二个应该是:write(1, &(newEntry->name[0]), 1);
  4. 对 fseek 的调用看起来是正确的,但作为问题的读者,我无法知道 clusterSize * root 是否是您正在读取的文件的正确偏移量。当您开始写入文件(或至少不显示它)时,您也不会寻找该偏移量,因此它变得更加模糊。
  5. 您在 for 循环中不断除以的 128 到底代表什么?同样在一个地方,你将 clusterSize 除以它,在另一个 bootrecord[0] 中。我假设它们的大小相同,但是...
  6. 在读取循环中,您分配了 128 字节的内存,但在写入循环中,您分配了 (sizeof(directoryEntry)。这是两种不同的大小,分配 128 字节是错误的,因为该结构包含指向112 个字节,而不是名称的实际 112 个字节。

我不确定是否有任何这些导致了您所看到的问题,您实际上并没有顺便说明,但它至少可以让您指出正确的方向。

关于c++ - 在 C++ 中使用 fread()、fwrite() 和 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com