0A在C中转换为0D0A
我必须使用C编写一个virtualdisk文件处理系统,作为大学项目的一部分(我运行的是windows),当我写入FAT表时遇到了一个问题,我试图创建一个FAT链,其中包含对FAT块10(0A 00)的引用,而它正在写入0D 0A 00 磁盘由1024个大小为1024的块组成,第一个块用于任意信息,第二和第三个块用于FAT,第四个块用于根目录,其余的块用于进一步的数据 FAT表定义为:0A在C中转换为0D0A,c,eclipse,windows,unix,C,Eclipse,Windows,Unix,我必须使用C编写一个virtualdisk文件处理系统,作为大学项目的一部分(我运行的是windows),当我写入FAT表时遇到了一个问题,我试图创建一个FAT链,其中包含对FAT块10(0A 00)的引用,而它正在写入0D 0A 00 磁盘由1024个大小为1024的块组成,第一个块用于任意信息,第二和第三个块用于FAT,第四个块用于根目录,其余的块用于进一步的数据 FAT表定义为: fatentry_t FAT[MAXBLOCKS]; typedef short faten
fatentry_t FAT[MAXBLOCKS];
typedef short fatentry_t;
Fatentry\u t的定义如下:
fatentry_t FAT[MAXBLOCKS];
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");
}
当我期待的时候:
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(常量字符*文件名){
printf(“writedisk>virtualdisk[0]=%s\n”,virtualdisk[0]。数据);
FILE*dest=fopen(文件名,“w”);
if(fwrite(virtualDisk,sizeof(virtualDisk),1,dest)<0){
fprintf(stderr,“将虚拟磁盘写入磁盘失败\n”);
}
fclose(dest);
}
无效写块(diskblock\u t*block,int block\u地址){
memmove(virtualDisk[块地址]。数据,块->数据,块大小);
}
编辑2:
感谢所有对此发表评论和回答的人,我没有编写writedisk函数,因此也没有注意到这一点,即将进行标记的指南将使用linux,我认为他不需要它处于二进制模式,因为linux只使用0A而不是0D0A,但对我来说,这将使在windows上开发更加容易。使用:
fopen( filename, "wb" );
而不是:
fopen( filename, "w" );
这将以二进制模式而不是文本模式打开文件
查看。您有一个文本二进制问题。您是否在某个时候使用了
fopen
?请显示writeblock
和writedisk
的代码。看起来您已经在Windows上以文本模式打开了文件,因此它会在每个0x0A字符前插入一个0x0D。您需要以二进制模式打开它。这是Windows上的经典模式。在Linux/Unix等系统上,没有二进制或文本模式,因为文本文件中的行尾是“\n”(0x0a),而在Windows中,行尾是“\r\n”(0xd 0xa)。是否可以使用fopen(文件名,“wb”);在linux和windows上?或者我需要向他说明这一点。在linux上,“wb”可能被忽略,请看一看。注意,一些操作系统使用'\r'
作为行尾,而'\r'
-->'\n'
是在阅读时发生的。一些早期的系统在文本模式的文件末尾有一个^Z
,在读取时将其剥离。从外观上看,除了“\r\n”
,二进制/文本的开口可能有各种不同的垂直度,尽管这在2015年是最常见的。