zoukankan      html  css  js  c++  java
  • 换行符‘\n’和回车符‘\r’详解(转载)

    换行符‘\n’和回车符‘\r’

    这是偶第二次自己写对外部的技术文档:

    这次公司要开发一个有关从外部读取权限信息。

    牵涉到了文件的解析。

    在文件的解析中,最麻烦的可能就数对一些控制符号的理解了。

    而首当其冲的就是换行符号'\n'与回车符号"\r".

    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,分析完毕!大致有了个了解了, 我要开始写代码了。呵呵,你懂了么?

  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/showker/p/1739947.html
Copyright © 2011-2022 走看看