作为大学项目的一部分,我必须使用C编写虚拟磁盘文件处理系统(我正在运行Windows),当我写入FAT表并尝试创建包含引用的FAT链时遇到了问题到FAT块10(0A 00),而是写入0D 0A 00。

磁盘由大小为1024的1024个块组成,第一个块用于任意信息,第二个和第三个块用于FAT,第四个块用于根目录,其余的块用于其他数据。

FAT表定义为:

    fatentry_t FAT[MAXBLOCKS];

Fatentry_t定义为:
    typedef short fatentry_t;

我使用以下方法访问它:
    typedef union block{
        datablock_t data;
        dirblock_t  dir;
        fatblock_t  fat;
    }diskblock_t;

我正在使用以下方法将FAT复制到磁盘:
    void copyFAT(){
        diskblock_t block = getEmptyDiskBlock();
        int pos = 0;
        for(pos = 0; pos < 512; pos++){
            block.fat[pos] = FAT[pos];
        }
        writeblock(&block, 1);
        for(pos = 512; pos < 1024; pos++){
            block.fat[pos-512] = FAT[pos];
        }
        writeblock(&block, 2);
        writedisk("src\\virtualdiskD3_D1");
    }

制作FAT链时,如果有对0A的引用,我将得到一个0D,例如:
00 00 02 00 00 00 00 00  05 00 06 00 07 00 08 00
09 00 0D 0A 00 0B 00 0C  00 0D 00 0E 00 0F 00 10
00 ...

当我期望:
00 00 02 00 00 00 00 00  05 00 06 00 07 00 08 00
09 00 0A 00 0B 00 0C 00  0D 00 0E 00 0F 00 10 00
11 ...

有谁知道是什么原因造成的?

我目前的想法是它是Windows,但是我不知道如何在Eclipse中修复它。

提前致谢。

编辑:
    void writedisk(const char *filename){
        printf("writedisk> virtualdisk[0] = %s\n", virtualDisk[0].data);
        FILE *dest = fopen( filename, "w" );
        if(fwrite(virtualDisk, sizeof(virtualDisk), 1, dest) < 0){
            fprintf(stderr, "write virtual disk to disk failed\n");
        }
        fclose(dest);

    }

    void writeblock(diskblock_t * block, int block_address){
        memmove(virtualDisk[block_address].data, block->data, BLOCKSIZE);
    }

编辑2:

感谢所有对此进行评论和回答的人,我没有编写writedisk函数,因此也没有注意到这一点,将要进行标记的指南将使用linux,我不相信他非常需要它处于二进制模式,因为linux仅使用0A而不是0D0A,但是对我来说,这将使在Windows上开发变得容易得多。

最佳答案

使用:

fopen( filename, "wb" );

代替:
fopen( filename, "w" );

这将以二进制模式而不是文本模式打开文件。

查看documentation of fopen

10-08 13:31