换行符到底是个神马东西?换行符详解

 在计算机还没有出现之前,有一种叫做电传打字机(Teletype  Model  33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

Unix系统里,每行结尾只有“ <换行> ”,即“\n”;Windows系统里面,每行结尾是“ <换行> <回车> ”,即“\n\r”;Mac系统里,每行结尾是“ <回车> ”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

google找到了这么一段信息:

换行符就是另起一行, 回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符  

'\n' 10 换行(newline)
'\r' 13 回车(return)

在windows系统下,回车换行符号 是"\r\n". 但是在Linux等系统下是没有"\r"符号的。

在解析文本或其他格式的文件内容时,常常要碰到判定回车换行的地方, 这个时候就要注意既要判定"\r\n"又要判定"\n"。

 

现在还是对它很模糊的概念, 那么我们写个测试的代码吧!

 

bool checkLineSymbol() {
char *fileStr;
Int32 length = 0;
Int32 i =0;
Int32 number = 0;
fileStr = loadPolicyFile();
if(fileStr == NULL) {
return false;
}

length = cStrlen(fileStr);
cTrace("file char length: \n");
cTrace("%d\n", length);

for(i = 0; i < length; i++) {
number = (Int32)(*(fileStr + i));
cTrace("number: %d\n", number );
}

cTrace("test checkLineSymbol is end!\n");

}

 

       代码看不懂没有关系, 上面的代码主要功能是从一个txt文件中输出每个字符的数字。我的这个文本文件中主要是写入了“\n”两个字符,同时进行了一个回车的操作。我想看一下输 出的结果是什么。最后输出的结果,显示有4个字符, 分别是92, 110,13, 10。也就是说我只是写入了2个字符,但是通过文件操作函数的read,它给我读出了4个字符。那么这三个数字分别代表什么呢。

 

        我去查了一下assII码表,92 为‘\’, 110为 'n', 13与10是控制符号,分别是'cr','nl'。说明了当我们在编辑文本文件(nodepad)的时候。每次调入一个回车键的时候,nodepad编辑 器自动给我们加了13,10两个控制符号。

 

       后来我又使用了vim文本编辑器进行相同的编辑,输出的结果为92, 110, 10三个字符。说明vim编辑器里面,敲入一个回车键, 该编辑器只是给我们添加了一个10控制符号来表示换行。

 

       这里我引出一个话题, 那就是notepad编辑器为什么在敲入回车键的时候,微软工程师们要加入一个\r呢。而vim也就是Linux帮派不加入这个控制符号呢? 这里面有什么猫腻, 就由读者你自己去研究了。我就不管这些东东了。等你研究出来我google罗。哈哈

 

C代码
  1. bool checkLineNumber() {  
  2.     char nL = '\n';  
  3.     char rL = '\r';  
  4.     Int32 number = 0;  
  5.   
  6.     number = (Int32)nL;  
  7.     cTrace("\\n in code number is: \n");  
  8.     cTrace("%d\n", number);  
  9.   
  10.     number = (Int32)rL;  
  11.     cTrace("\\n in code number is: \n");  
  12.     cTrace("%d\n", number);  
  13.   
  14.     cTrace("test checkLineNumber is end");  
  15. }  
bool checkLineNumber() { 	char nL = '\n'; 	char rL = '\r'; 	Int32 number = 0;  	number = (Int32)nL; 	cTrace("\\n in code number is: \n"); 	cTrace("%d\n", number);  	number = (Int32)rL; 	cTrace("\\n in code number is: \n"); 	cTrace("%d\n", number);  	cTrace("test checkLineNumber is end"); }  

 

      上面这段代码,主要是说明一下,我们在编写代码中。有一个叫字符转义符号的问题。通常我们在解析文件中的数据的时候,都要判断文件是否需要换行。这样我们 就知道那里是换行,那里不换行了。以为我们以后的逻辑处理。

      

       那么为什么要引入字符转义符号呢?个人觉得主要是为了方便记忆吧。'\r',代表回车符号。 '\n'代表换行,外文也就是newLine,老外搞的一套东东。代码在进行编译的时候,编译器会做处理,把'\r'转成13。

      

       其实我们完全可以写成char nL = 13;来代表这个字符是回车符号。但是char nL = '\r'比较直观。这里我做一个猜测:在编译C阶段,char nL = 13;这段代码行可能比char nL = '\r'快。因为编译器要对后一个代码做一些额外的处理。当然这是没有必要的,因为毕竟这些消耗是可以忽略不记的,相对现在的计算机处理速度。

      

       好了,现在说说我上面代码的功能吧,主要是看看'\r'与'\n'分别是什么值。输出的结果是'\r'为转义成了13, '\n'被转义成了10.

 

       now,分析完毕!大致有了个了解了, 我要开始写代码了。呵呵,你懂了么?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值