Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
0A在C中转换为0D0A_C_Eclipse_Windows_Unix - Fatal编程技术网

0A在C中转换为0D0A

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

我必须使用C编写一个virtualdisk文件处理系统,作为大学项目的一部分(我运行的是windows),当我写入FAT表时遇到了一个问题,我试图创建一个FAT链,其中包含对FAT块10(0A 00)的引用,而它正在写入0D 0A 00

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

FAT表定义为:

    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年是最常见的。