现在的位置: 首页 > 综合 > 正文

UNIX、DOS文件格式的区别

2019年04月21日 ⁄ 综合 ⁄ 共 2372字 ⁄ 字号 评论关闭

       【背景】老师布置写个静止图像压缩的程序。用DCT变换和游程编码写了个简易的版本,编码和解码端就是对不上,报出莫名其妙的错误。debug良久,最后,将压缩结果用fwrite写入文件之后,直接用fread原样读取,结果照样出错!问题找到了,但是不知道原因。查了很久,终于发现可能是文件格式的问题,今天终于发现了。

      fwrite写文件测试。先指定参数为wb,表示二进制格式,写入0x00-0xff共256个数,包括了ASCII码表中的所有值。    代码如下:

int main()
{
	char aa[256];
	int i;
	for (i=0; i<256; i++)
	{
		aa[i] = i;
	}
	FILE *wr;
	wr=fopen("asd.txt","wb");
	if (wr==NULL)
	{
		printf("wrong!\n");
		return(1);
	}

	fwrite(aa,1,256,wr);
	fclose(wr);
         return 0;
}

      得到的结果没有问题。文件属性显示大小确实为256字节。用UltraEdit来看,提示是否转为DOS格式,选择否,然后看到的结果也是正确的。

                                         

                                                                图1                                                                                                                           图2

      不过,用UltraEdit打开的时候,提示是否转为DOS格式,如果选择是,就不是图2的结果了,而是图3:

                                              

                                                                                                                                          图3
       文件属性也显示,文件大小为257个字节。仔细检查,发现在0x09和0x0A之间多了一个0x0D。而其他地方则是一样的。在上面的测试代码中,将二进制模式"wb"改为文本模式"wt",或者不指定模式(默认为文本模式),则得到的结果也是图3的形式。

wr=fopen("asd.txt","wt");

      因此,可以总结如下:

       1.  fwrite函数,加上b表示二进制模式;不加或者加上t表示文本模式。

       2.  fwrite用二进制模式写文件时,原样写入;文本模式写文件时,遇到换行符(0x0A,10,\n,LF,line feed),会在前面插入一个回车符(0x0D,13,\r,CR,carriage return)。

      3. 另外,最好fread与fwrite相对应,统一采用文本模式或二进制模式。fread遇到\r\n,即0D0A时,会解释为0A。

      这只是在windows系统下如此。关于文件格式,有一段资料非常经典

http://linux.chinaunix.net/techdoc/system/2009/07/17/1124903.shtml

以及

http://shx-yi123.iteye.com/blog/750717

用UltraEdit打开文件时有时会提示“提示希望转换xxx 到DOS格式吗?”原因如下:
    很久以前,人们用老式的电传打字机作为输入设备,它使用两个字符来另起新行。一个字符把滑动架移回首位 (称为回车,DE><CR>DE>),另一个字符把纸上移一行(称为换行,DE><LF>DE>)。
    当计算机问世后,由于存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行尾。
    于是UNIX 开发者决定他们可以用 DE><Line Feed>DE> 一个字符来表示行尾。  
    Apple开发者规定了用 DE><CR>DE>。
    开发 MS-DOS (以及微软视窗) 的那些家伙则决定沿用老式的 DE><CR>DE>DE><LF>DE>。
    三种行尾格式如下:
        unix            DE><LF>DE>
        dos             DE><CR>DE>DE><LF>DE>
        mac             DE><CR>DE>
   这意味着,如果你试图把一个文件从一种系统移到另一种系统,那么你就有换行符方面的麻烦。
取消该提示的措施:

如果你的程序将来需要在UNIX/linux,最好是保持 unix的格式。

点选 高级 菜单—>文件处理 —> 选择 DOS/UNIX/MAC 处理 ,在右侧的unix/mac 文件检测/转换下面,勾上 禁用。确定,以后就不会提示了。

      总结如下:

      1. dos、windows下,行尾为 \r\n

      2. mac下,行尾为 \r

      3. UNIX/LInux下,行尾为 \n

      转换时,可以借助工具或脚本。如UltraEdit另存为时,可以选择换行模式。

                                                   

                                                                                                                             图 4

抱歉!评论已关闭.