0A转换为0D0A in C

时间:2015-10-29 13:29:34

标签: c eclipse windows unix

我必须使用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上开发变得更加容易。

1 个答案:

答案 0 :(得分:5)

使用:

fopen( filename, "wb" );

而不是:

fopen( filename, "w" );

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

查看documentation of fopen