作为大学项目的一部分,我必须使用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。