在C+中使用fread()、fwrite()和malloc+; 我在C++中使用Frad和Fuffic函数有惊人的困难。

在C+中使用fread()、fwrite()和malloc+; 我在C++中使用Frad和Fuffic函数有惊人的困难。,c++,filesystems,malloc,fwrite,fread,C++,Filesystems,Malloc,Fwrite,Fread,该项目正在编写一个基本的FAT16文件系统,我们仅限于使用fread和fwrite 最初编写文件时,我的代码如下所示: directoryTable = (directoryEntry *)malloc(clusterSize); for (int i = 0; i < bootRecord[0] / 128 ; ++i){ directoryEntry * newEntry = (directoryEntry *)malloc(sizeof(d

该项目正在编写一个基本的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;
    }
        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;
    }

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

我看到很多小问题:

  • 您不会将为名称指定的内存归零。尝试memset(newentry->name,0112)
  • 写入名称数组时正在写入其第二个元素(索引1),读取名称数组时正在写入其第一个元素(索引0):写入(1,&(newEntry->name[1]),1;vs.write(1,newEntry->name[0],1)
  • 此外,在第一次写入中,您要获取它的地址,而在第二次写入中,您没有,因此看起来第二次写入应该是:write(1,&(newEntry->name[0]),1)
  • 调用fseek看起来是正确的,但作为问题的读者,我无法知道clusterSize*root是否是您正在读取的文件中的正确偏移量。当您开始编写文件时,您也不会寻找该偏移量(或者至少不显示它),因此它变得更模糊
  • for循环中不断除以的128究竟代表什么?同样,在一个点中,您将clusterSize除以它,在另一个引导记录中[0]。我想它们的尺寸是一样的,但是
  • 在读循环中,您需要malloc 128字节的内存,但在写循环中,您需要malloc(sizeof(directoryEntry)。这是两种不同的大小,malloc'ing 128字节是错误的,因为结构包含指向112字节的指针,而不是实际的112字节作为名称

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

    可能与您的问题无关,但仍然很重要:执行
    directoryEntry*newEntry=(directoryEntry*)malloc(…);
    然后执行
    directoryTable[i]=*NeWEnter;会导致内存泄漏。文件是C++,我使用C++编译器,但我受限制(由我的教授)也就是说,我如何避免内存泄漏?我假设删除NeXEnter会导致DealTyToEnter对象消失。谢谢你的回复。为什么MalC++这个名字?你可以在栈上做一个112字符数组,只是指向那个。谢谢你的回答。我为我的问题中的歧义表示歉意。n、 1.)我不知道memset函数,我会尝试一下。2.)这是因为在我的结构定义中,name是char*但没有其他东西是指针,所以我需要引用它们的内存地址。3.)这也是我没有注意到的事情,但你是对的,这没有意义。4.)我忘了包括我的另一个fseek调用,但我同意t很难理解…但我不确定是否有其他方法可以做到。5.)128应该是目录项的大小。112代表名称,然后是4代表每个无符号整数。6.)我早在编码读取循环之前就对写入循环进行了编码,这可能解释了其中的模糊性。sizeof(directoryEntry)是错误的,所以我将改变这一点。我将尝试玩其中一些东西。再次感谢您的回答。您帮了我很大的忙。sizeof(directoryEntry)是正确的,因为您正在为该结构分配内存。您正在单独分配的名称的112字节。我希望我的答案可以帮助您解决最终问题。
    
         typedef struct{
    char * name;
    unsigned int index;
    unsigned int size;
    unsigned int type;
    unsigned int creation;
        } directoryEntry;