问题来源:
“回车”(carriage return)VS “换行”(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" ;
}
所谓回车、换行这些控制符,都是从以前的电传打字机的控制命令继承下来的。回车就是打印头复位,换行就是走纸。Dos/Windows和Unix/Linux对回车、换行的理解差别就在于Dos/Windows认为0d=0d0a=0a,而Unix/Linux坚持沿用电传打字机的工作方式(这个其实是比较正确的)。
所以在回车换行在Linux中是"0d",在Windows中是"0d0a".我们可以通过下面的程序测试一下:
上面的红色字体估计是原作者笔误,linux的换行符是\n,Ascii码是0a,而不是0d。至于要测试的话,可以使用od -t x1 文件名去查看。
而\r在linux下的vi看到的是蓝色的^M,是使用ctrl+m+v输出的,可以在命令模式中使用
:%s/^M//g删除,或者使用dos2unix去掉。
#define MAX_LENGTH 15536
#include
#include
using namespace std;
string delEnter(const string src) // 过滤掉串中的回车换行符
{
string des;
for(int i = 0; i < src.length(); i++)
{
char tempChar = src[i];
if( tempChar!=10 && tempChar!=13)
des.append(1,tempChar);
}
return des;
}
int main()
{
char html[MAX_LENGTH] = "";
FILE *fp = fopen("Linux.txt", "rb"); //FILE *fp = fopen("Windows.txt", "rb");
char buf[16384];
while (fgets(buf, 16384, fp))
strcat(html, buf);
strcat(html,"\0");
string s(html);
cout << "string is: " << s << endl;;
cout << "The size of string is: " << s.length() << endl;
cout << "after del string is: " << delEnter(s) << endl;
cout << "The size of string is: " << delEnter(s).length() << endl;
fclose(fp);
return 0;
}
程序中文件Linux.txt是从Linux系统中copy过来的。
我们可以通过这个程序观察到,通过过滤掉回车换行符,Linux文件中的字符数的减少等于其行数,而
Windows中等于其行数的两倍。但有一个问题要注意,程序中行:
FILE *fp = fopen("Linux.txt", "rb");
不能写成:
FILE *fp = fopen("Linux.txt", "r");
后者默认的文件打开方式是文本方式,这时系统自动对文本进行了转换,就不能得到上述的结论。
不过大家可以在Windows下用工具HexWorkShop,在Linux下用命令hexdump直接观察具体的二进制代码,更为直接。
原文地址:http://noding.bokee.com/3867119.html
关于回车和换行的历史。
回车和换行
关于“回车”(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符号。
Dos和windows采用回车+换行CR/LF表示下一行,
而UNIX/Linux采用换行符LF表示下一行,
苹果机(MAC OS系统)则采用回车符CR表示下一行.
CR用符号'\r'表示, 十进制ASCII代码是13, 十六进制代码为0x0D;
LF使用'\n'符号表示, ASCII代码是10, 十六制为0x0A. 所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.
一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件. 在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常, 但在编辑时却会因为换行符问题而出错. 很多文本/代码编辑器带有换行符转换功能, 使用这个功能可以将文本文件中的换行符在不同格式单互换.
在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化. 如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本.
分享到:
相关推荐
回车换行符(CR+LF)在不同操作系统中表示新行的方式可能不同,例如在Windows系统中是两个字符(\r\n),而在Unix或Linux系统中仅使用一个字符(\n)。因此,当跨平台处理文本时,可能会出现显示问题,此时就需要...
- - 去除数据文件中字符串的换行符; - - 使用此工具,必须有明确的行分隔符标记,且换行符标记不可在字符串中出现。否则无法使用,需要修改匹配搜索方式 ### 工具效率: 亲测200M文件5s中完成转换。 ### 使用...
- 对于不同平台的文本处理,需要注意不同的换行符(Windows使用`\r\n`,Unix/Linux使用`\n`)。 通过以上知识点的详细解析,我们可以了解到Java中去除字符串中的空格、回车、换行符、制表符的具体实现方式及其应用...
Mac OS早期版本使用单独的回车符(CR,ASCII码13)作为换行标志,但现代的Mac系统已经与Linux一致,使用LF作为换行符。 这个问题的起源可以追溯到早期的电传打字机时代,其中“回车”(CR)是将打印头移回一行的...
在Java中,换行符通常使用`\r\n`(回车加换行)或`\n`(仅换行)来表示。其中: - `\r`:回车,ASCII码为13。 - `\n`:换行,ASCII码为10。 Java中对于换行符的支持是跨平台的。例如,在Windows平台上,默认使用`\r...
换行符在不同的操作系统和文本编辑器中可能会有所不同,例如,Windows系统中常用回车换行符(CR+LF),而Unix/Linux系统则只使用换行符(LF)。因此,这个工具可能设计用来统一电子书中的换行符格式,使得它们能在...
回车换行符是文本中用于表示新行的特殊字符组合,通常由`\n`(换行符)和`\r`(回车符)组成,尤其是在Windows系统中。而在Unix和Linux系统中,通常只使用`\n`作为换行符。了解如何有效地替换这些字符可以帮助我们...
在 Linux 和 Windows 平台下,我们可以通过试验来证明回车符和换行符的意义。例如,在 Linux 下,我们可以使用 sprintf 函数来生成一个字符串,并使用 printf 函数来打印输出。在这个例子中,我们可以看到,回车符...
### UNIX与Windows文本文件换行符差异详析 在探讨UNIX与Windows文本文件换行符差异之前,我们首先需要理解换行符的基本概念及其在不同操作系统中的实现方式。换行符,简而言之,是在文本文件中用于表示新行开始的...
相反,Windows系统使用的是回车换行符组合(\r\n)来标记行的结束。这就导致了当一个在Linux环境下创建的文本文件在Windows中打开时,可能会出现乱码、显示不全或者每一行都合并成一行的问题。 要解决这个问题,...
第一个正则表达式中,添加了"\r\n"来确保匹配模式可以识别Windows系统中的回车换行符,而第二个表达式中使用了"$"作为结束锚点,企图匹配字符串的结束。但是,由于在读取文本文件时,文本的实际内容包含了回车换行符...
在这个例子中,无论程序运行在Windows、Linux还是Mac上,`System.lineSeparator()`都会返回对应系统的正确换行符,使得输出的“Hello”和“World”之间始终能正确换行。 另外,如果你需要在字符串中硬编码特定操作...
在Linux下创建的文本文件通常会在每一行末尾包括一个换行符,包括最后一行,而在Windows下创建的文件,最后一行可能不包含换行符。 为了处理这些兼容性问题,可以使用工具如`sed`来转换文件中的换行符格式,使其...
2. **UNIX/Linux系统**:在UNIX和Linux系统中,仅使用换行符`\n`来表示行结束。这是因为UNIX的设计理念倾向于简单性和效率,单个字符就能完成行的换行操作。这也意味着UNIX/Linux创建的文本文件在Windows系统上可能...
在Linux系统中,每行文本的结束是以一个换行符(LF)表示的,而在Windows系统中,每行的结束则由两个字符组成:回车符(CR)和换行符(LF)。这种差异在跨平台操作时可能会导致文本文件显示不正常,例如,Windows下...
我们可以看到,在 Linux 中,遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^M")显示,不发生回车的操作。而在 Windows 中,要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符...
Mac OS X 10.0之前的版本使用单一的`\r`作为换行符,但在之后的版本中与Unix/Linux保持一致,使用`\n`。 理解这些换行符的差异对于编写跨平台的Java代码尤其重要,尤其是在处理文本文件和用户界面的显示时。通过...
Unix/Linux使用的是LF,Mac后期也采用了LF,但Windows一直使用CRLF【回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)】作为换行符。而git入库的代码采用的是LF格式,它考虑到了跨平台协作的场景,提供了“换行符自动...
在计算机编程中,尤其是在C语言或类似的文本输出中,使用`\r`会使当前输出的光标回到当前行的开头,但不会换到下一行。例如,在一个C语言程序中,如果连续输出"hahaha"和"\r"后的"xixi",最后只会显示"xixi",因为"\...