LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: float

为什么C程序源文件末尾一定要留一空行

[复制链接]
发表于 2004-5-29 18:32:45 | 显示全部楼层
最初由 libinary 发表
关于回车符和换行符,如果你用过机械打字机就能比较明白了,打字机上面有一个可以动的小车,小车上有卷纸的滚筒,每打一个字符,小车就移动一个字符的距离,等打完一行以后,用手推小车到原始位置(一行的开头),这个叫回车,转动滚筒,把打字的位置换到下一行,这个叫换行,实际上小车上有一个把手,每次打完一行直接推这个把手就会产生连续动作,先回车后换行,所以计算机里的字符序列也是\r\n。

计算机里\r就是把输出光标移到本行的开头,\n就是下移一行(列位置还和当前的一样),所以应该是\r\n才能移到下一行的开头,不过一般的库函数都自动处理这种情况了,printf("cc\n");库函数直接把\n替换成了\r\n序列,在dos/windows下用cprintf之类的函数就可以看到没有替换的效果(开头的c的意思是con,c打头的函数有好几个,包含在<conio.h>里,最好是borland或MS的编译器,我用Dev-C++试过,不行),在UNIX系统里系统直接处理\n,所以写程序比较简单,不需要我们考虑什么转换,不象dos/win里,文件保存的都是\r\n,用库函数读进来全是\n,要是不用库函数,我们自己还要做转换,不管是转换还是对结果大小的判断都比较麻烦。


应该是:先换行后回车
:p看来你是没用过这种打字机
发表于 2004-5-29 20:00:13 | 显示全部楼层
用是用过,不过是很久以前了,我家里现在就有一个,刚才试了一下,果然是先换行后回车。
呵呵,惭愧、惭愧,原来没实验就凭记忆乱发帖子。
发表于 2004-6-12 21:27:25 | 显示全部楼层
我用xxd看了用vim写的文件,
vim会自动在最后一行末尾加上"\n" 即 0x0a
发表于 2004-6-14 08:17:24 | 显示全部楼层
既然讨论了,就问一下,linux文本的换行究竟是10还是13,还是10和13?我以前写程序为了保险和偷懒,几乎都是用 (a==10 || a==13)。也没有自己去验证。
发表于 2004-6-14 18:52:50 | 显示全部楼层
最初由 tx-cary 发表
既然讨论了,就问一下,linux文本的换行究竟是10还是13,还是10和13?我以前写程序为了保险和偷懒,几乎都是用 (a==10 || a==13)。也没有自己去验证。

三类OS的行结束符:

DOS/Win          "\r\n"
Mac              "\r"
UNIX/Linux       "\n"
发表于 2004-6-4 20:00:26 | 显示全部楼层
最初由 libinary 发表
关于回车符和换行符,如果你用过机械打字机就能比较明白了,打字机上面有一个可以动的小车,小车上有卷纸的滚筒,每打一个字符,小车就移动一个字符的距离,等打完一行以后,用手推小车到原始位置(一行的开头),这个叫回车,转动滚筒,把打字的位置换到下一行,这个叫换行,实际上小车上有一个把手,每次打完一行直接推这个把手就会产生连续动作,先回车后换行,所以计算机里的字符序列也是\r\n。


DOS/Windows的行结束符才是\r\n.

DOS/Windows系统和UNIX/Linux系统及Mac系统的行结束符不一样.

DOS/Windows 的行结束符是 "\r\n" (回车符+换行符)
UNIX/Linux 的行结束符是 "\n" (换行符)
Mac 的行结束符是 "\r" (回车符)
发表于 2004-6-4 20:11:31 | 显示全部楼层
利害,见识了!!
发表于 2004-6-7 17:26:28 | 显示全部楼层
是文件结尾标志。
你用ultraedit打开一个Unix格式的文本文件,就会明白。
发表于 2004-6-8 22:27:07 | 显示全部楼层
看我的程序代码末尾"}"后没有\n
编译正常通过。
发表于 2004-6-10 01:18:18 | 显示全部楼层
我也遇到gcc编译一些c文件的时候会警告最后没有留一空行,但是程序还是可以编译通过的,到底为什么要留一空行啊,前面好象没有真正讲清楚呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表