在LINUX中应用程序读取一个文本文件的内容,但只读对了第一行内容,以后读出都是空,很纳闷。发现在linux/unix下的回车符与windows下的不同,linux/unix下的回车符是'0d',而在windows下侧是'0d0a',据说这和电脑刚开始发展时的电传打印机的速度有关,在网上搜到以下资料放到此处学习:
http://casec12.javaeye.com/blog/523160
今天,我总算搞清楚“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别了。
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“/n”;Windows系统里面,每行结尾是“<换行><回车>”,即“/n/r”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
c语言编程时(windows系统)
/r 就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉
如:
int main() {
cout << "hahaha" << "/r" << "xixi" ;
}
最后只显示 xixi 而 hahaha 背覆盖了
/n 是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉
int main() {
cout << "hahaha" << "/n" << "xixi" ;
}
http://hi.baidu.com/elric9/blog/item/2a60801871f2f5158718bf41.html
为什么我在 vi 等编器下打开一个文本文件会包含 ^M, 如何把它去掉? (见结论 4, 5)
为什么我在 windows 上用记事本打开 unix上的文件, 文件都不换行? (见结论 1)
原因分析:
要解决这个问题, 必先弄清 unix 与 windows 文本文件的差异:
1) 磁盘中 Windows 文本文件总是以 “回车” + “换行”的形式进行换行的.
2) 磁盘中 Unix 格式的文本文件, 总是以”换行符”(即: LF, ‘n’) 换行, 而非 “回车换行符”.
(Unix 规定: unix 文本文件保存到磁盘时, 总是自动把 “回车换行符” 转换成 “回车符” 保存,
输出到终端时由终端自动将将 “回车符” 转换成 “回车换行符” 输出.)
** 容易看出 **:
Windows 格式的文件换行时, 总是比 Unix格式的文件多一个 “回车” (’r’) 符.这是从老式的打字机上面遗传下来的,老式的打字机中的回车是指打印头回到行首,换行是进纸并开始下一行打印。
** 结论 1 **:
这样在 windows 的记事本中打开 Unix 格式的文件时, 因为文件中没有 ‘r’, 所以无法正常显示.
结果就会把所有的内容显示在同一行中.
** 结论 2 **:
UtraEdit 等工具会自动检测文件中是否包含 ‘r’, 当检查行末缺少 ‘r’时, 一般它会提示
要求进行 Unix 到 Windows 格式的转换. (相信大家都遇到这个提示信息).
** 结论 3 **:
UtraEdit 和 vi 等工具, 在保存文件时会自动依照文件原来的格式进行保存. 即:
如打开的如是 windows 格式它会把文件依然按 windows 格式保存 (不进行自动转换).
如打开的如是 unix 格式它会把文件依然按 unix 格式保存 (不进行自动转换).
** 结论 4 **:
向 UtraEdit 打开的 Unix 格式文件中, 通过粘贴板 “粘贴” Windows 格式的若干片断行时
(或反之, 即向 Windows 格式文件中, 通过粘贴板 “粘贴” Unix 格式的若干片断行时),
代码片断中的 “回车换行符” “不会” 自动转换成单个 “换行” 符(反之亦然).
这样, 该文件中就会出现 “回车符” 与 “回车换行符” 互相夹杂.
即, 文件中既有单独的 “回车符” 也有 成对的 “回车换行符”.
** 结论 5 **:
vi 编辑器等, 既能正确显示”规则”的 Unix 格式文件, 也能正确显示”规则”的 Windows 格式文件,
但, 对包含单独的 “回车符”, 同时成对的 “回车换行符”的不规则文件 (产生原因见结论 4),
vi 将把回车符以 ^M 的形式显示.
解决方法:
使用类似问题 2 提供的解决方法即可解决, 不再骜述.
将 unix 转换成 Windows 格式时, 使用 unix2dos 或 win2unix -r(-r 代表反方向)即可.
则 显示
hahaha
xixi
由此可见,如果LINUX下应用程序需要读取windows下的文件,需要特殊的文本转换工具才行。比如EditPlus 2就是不错的工具。
相关推荐
例如,当在Windows环境下打开一个纯UNIX格式的文本文件时,由于文件中只有换行符(LF),没有回车符(CR),因此Windows系统默认的记事本程序无法识别正确的换行位置,导致所有文本内容被显示在一行内,造成阅读困难...
回车与换行是计算机文本处理中的两个基本概念,它们起源于早期的电传打字机时代,以解决打印头定位和纸张移动的问题。在现代计算机系统中,这两个概念仍然有着重要的作用。 回车(Carriage Return),用字符`\r`...
同样,一个在Linux上创建的文本文件,在Windows下打开时,可能无法正确识别每一行的结尾,从而导致文本显示为一整段,没有换行。 为了克服这些兼容性问题,现代的文本编辑器和开发工具通常提供了自动检测和转换行...
在 DOS/Windows 和 Linux/Unix 之间,文件格式最大的区别就在于换行回车格式的不同。DOS/Windows 的文本文件在每一行末尾有一个 CR(回车)和 LF(换行),而 UNIX 文本只有一个换行。这意味着,如果我们把 DOS/...
这个过程主要是处理文件中的换行符差异,因为Windows使用的是CRLF(回车+换行)作为行结束符,而Linux/Unix系统只使用LF(换行)。 描述中提到的“换行问题”是指在跨平台操作时,由于不同操作系统对文本文件中行...
回车和换行区别 回车和换行是计算机编程中两个基础概念,但它们的区别和来历却鲜为人知。本文将深入探讨回车和换行的历史、概念、区别和应用,以帮助读者更好地理解和掌握这些基础知识。 历史 在计算机出现之前,...
回车换行(Carriage Return, Line Feed,简称CRLF)是计算机文本处理中用于表示新行的字符组合。在不同的操作系统中,回车换行的表示方式有所不同: 1. **Windows系统**:Windows使用`\r\n`(0x0D, 0x0A)作为一行...
下面是一个简单的C语言代码示例,用于演示不同文件操作模式下对回车换行字符的影响: ```c #include int main() { FILE *fp1, *fp2, *fp3, *fp4; char a[10], b[10]; // 以文本模式打开文件 fp1 = fopen("01...
1. **系统调用**:C语言在Linux/Unix环境下编程,主要依赖于系统调用来与操作系统进行交互。例如,`fork()`用于创建子进程,`exec()`系列函数用于执行新的程序,`pipe()`和`socket()`用于进程间通信,`open()`和`...
这些文件由于行尾符的不同可能会引起问题,因为DOS/Windows文件使用的是CRLF(回车换行)作为行结束符,而Unix/Linux系统使用的是LF(换行)作为行结束符。标题"linux下dos转unix"指的是将DOS格式的文件转换为Unix...
在文本编辑器或编程环境中,按下回车键会触发一个“换行”操作,将光标移动到下一行,从而在文本中创建新的段落或语句。 在编程和数据传输中,回车键和换行符常常是分开讨论的。回车(CR)字符表示返回到一行的起始...
Windows操作系统使用回车换行(\r\n)作为一行结束的标识,而Unix/Linux系统则只使用换行(\n)作为新的一行开始的标记,而在早期的Apple Mac OS系统中,回车(\r)就足够表示新行。 回车字符(CR,Carriage Return...
而在Windows系统中,每行结束使用回车换行两个字符(CR LF),即ASCII码13紧接着ASCII码10。Mac系统早期(OS 9以前)采用的是单独的回车符(CR)作为行结束。现代的Mac OS X则遵循了Unix标准,使用LF作为换行符。 ...
而Windows系统在表示新行时则采用了回车换行的组合(CR+LF),即每行结束时同时使用CR和LF字符。Mac系统早期使用回车符(CR)作为新行的表示方式,这反映了其早期产品在文本处理方面的设计选择。 由于不同操作系统...
在 Windows 下是 "\r\n",在 Linux(Mono) 下是 "\n"。这样,我们可以使用 Environment.NewLine 属性来设置多行文本,例如: ```csharp TextBox.Text = "First Line" + Environment.NewLine + "Second Line" + ...
这个工具处理的主要问题是换行符的不同:DOS/Windows使用CRLF(回车+换行)作为行结束符,而Unix/Linux仅使用LF(换行)作为行结束符。在跨平台操作时,如代码编辑或脚本执行,这种差异可能导致问题。 在描述中,...
Windows主要使用DOS/Windows风格的文本文件换行符(CRLF,即回车换行),而Linux则使用UNIX风格的换行符(LF,即只使用换行)。此外,Windows的压缩工具如WinRAR或7-Zip在处理文件时可能会包含特定的Windows元数据,...
这两种系统对文本文件的行结束符处理方式不同,Windows使用CRLF(回车换行)作为行结束符,而UNIX/Linux则只使用LF(换行)作为行结束符。这在跨平台操作时可能会引发问题,如代码编辑器显示异常或脚本执行错误。...
在不同的操作系统中,文本文件的换行符表示方式不同:DOS/Windows使用回车(CR)和换行(LF)组合,而UNIX/Linux仅使用换行(LF)。dos2unix可以将DOS/Windows格式的文本文件转换为UNIX/Linux格式,或者反之。 描述...
在探讨“DOS与UNIX回车”的主题时,我们深入剖析了两种操作系统处理文本行结束符的不同方式,以及这一差异如何影响跨平台的文件兼容性。本文将详细阐述DOS和UNIX系统中回车换行符的区别,以及如何在不同环境间转换...