彻底搞定0x0d和0x0a

转载自:http://www.linuxdiyf.com/viewarticle.php?id=110597
什 么是0x0d和0x0a,可能大部分人都知道是回车和换行字符,但那个是回车,那个是换行?估计很多人都一时说不清楚了---也许你不相信,那就调查下周 围的同事吧,估计会包含以下字眼“大概。我记得。回车是0x0d吧”。这次我移植arm-linux C的程序,至VC++,发现了很多不同,尤其是这个回车换行浪费我一上午的时间,我决定借此机会彻底搞定他们,这两个令人讨厌的家伙。

先 说下浪费我一上午的那个东西----教训是很重要的,希望大家不要重蹈我的覆辙----,在arm-linux下,写二进制文件,打开文件的时候 这样写就可以了fp_wthdisk = fopen(file_pathname,"w");,以w格式写就可以了。把这段程序移植到vc++后,发现一旦我向文件写入0x0a,前边就会自动加 上0x0d,我以为是我写入数组的问题,反复检查也没有找到毛病,后来同事问我:“你是不是二进制格式写入的文件?”我说:“是呀,fwrite w格式,没有问题呀”,后来他说,你试试“wb格式写入一下”,改为wb后,果真就好了,厉害!,我对他竖起了大拇指。

看到这里,上边促 使我下决心搞清楚回车换行的原因说完了。我想可能有人会犯同样错误的。但如果你对以下几个问题,都知晓了,就不必浪费时间,继续看下去了。

1. 在Windows XP Visual C++下,按下回车键,系统获得的字符是0x0d还是0x0a,还是0x0d和0x0a?

2. 回车(0x0d)的作用是回到本行的行首位置,表示本行已经输入完毕,停留在最后一个位置,还是光标转移到下一行的起始位置?

1.的答 案是仅获得字符 0x0d

2.答案是回车的作用只是移动光标至该行的起始位置

注意:回车和换行在不同环境下的意义不 同,正如sleep(1)和Sleep(1)【注意S大写】这两个函数的不同一样,sleep(1)在linux下表示延时1s,而Sleep(1)在 vc++下表示延时1ms,如果不依据环境来讨论回车和换行,是无意义的,只能是让人们误入歧途和浪费时间。

我只在arm-linux C和vc++下做了试验,请大家在接触其它语言环境下,小心推广,不行就自己动手做试验,最可靠。在arm-linux C和vc++下回车换行的意义如下。

回车 代码:CR ASCII码:/ r ,十六进制,0x0d,回车的作用只是移动光标至该行的起始位置;

换行 代码:LF ASCII码:/ n ,十六进制,0x0a,换行至下一行行首起始位置;

Linux和windows下,回车试验

CODE:
sprintf(versionbuf,"%s","TEST_VERSION_1_0_11/rabcdefg/r34567/n");
printf("%s",versionbuf);


均 打印输出:34567fgRSION_1_0_11,证明了以上结论。

其实回车和换行之所以把大家搞迷糊的一个重要原因,是大家把键盘 的 “回车键”,0x0d表示“回车”,我们在windows下的txt文件下敲下的回车键等情况搅在了一起。在键盘上敲下回车键,在不同软件下获得字符大有 不同。

Windows下在txt文件中敲下回车键,然后16进制观察,你会发现获得了2个字符,0x0d和0x0a,这个大家都知道, 但这不意味着,在任何情况下敲下回车键,都会获得0x0d和0x0a。

在linux下,你对一个文件,敲下回车键,你就会发现,它每次 只增加一个字符。

你可能感兴趣的:(Linux)