在C ++中使用fread(),fwrite()和malloc

时间:2012-02-06 02:48:00

标签: c++ filesystems malloc fwrite fread

我在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-&gt; name的第一个字符分配给&#39; a&#39;时,我的意图实际上是为它分配值0x00,以便我稍后可以检查它是否为&#39; s空值。我只是使用权限进行调试。我的问题是当我读到它时,我什么也得不回来。

当我阅读时,我的代码如下:

        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 个答案:

答案 0 :(得分:2)

我看到很多小问题:

  1. 您没有将malloc为名称的内存归零。尝试memset(newentry-&gt; name,0,112);
  2. 编写名称数组的第二个元素(索引1),以及读取它时名称数组的第一个元素(索引0):write(1,&amp;(newEntry-&gt;名称[1]),1);与write(1,newEntry-&gt; name [0],1);
  3. 此外,在第一次写入时,您正在获取它的地址,而在第二次写入中,您不是,所以它看起来像第二次应该读取:write(1,&amp;(newEntry-&gt; name [0] ),1);
  4. 对fseek的调用看起来是正确的,但作为问题的读者,我无法知道clusterSize * root是否是正在读取的文件中的正确偏移量。当你开始写文件时(或者至少不显示文件),你也不会寻求这种偏移,所以它变得更加模糊。
  5. 你在for循环中分配的128到底是什么意思?同样在一个位置,您可以将clusterSize除以另一个bootrecord [0]。我认为那些大小相同,但是......
  6. 在read循环中你有malloc 128字节的内存,但在write循环中你是malloc(sizeof(directoryEntry)。那是两个不同的大小,而malloc'ing 128字节是错误的,因为结构包含一个指向112字节,而不是名称的实际112字节。
  7. 我不确定是否有任何这些导致您遇到的问题,顺便说一下您实际上没有指明,但它至少可以让您指向正确的方向。