我必须使用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);
}
EDIT2:
感谢所有评论和回答此问题的人,我没有编写writedisk函数,因此没有注意到这一点,将要标记的指南将使用linux,我不相信他需要它在二进制模式,因为linux只使用0A而不是0D0A,但对我来说这将使得在windows上开发变得更加容易。
答案 0 :(得分:5)
使用:
fopen( filename, "wb" );
而不是:
fopen( filename, "w" );
这将以二进制模式而不是文本模式打开文件。