• 回车和换行 详解


    来自:http://blog.163.com/bluesky_07_06_1/blog/static/164440083201072732718589/

    ----------------------------------------------------------------------------------------------------

    1.回车和换行

    关于“回车”(carriage return)“换行”(line feed) 这两个概念的来历和区别。
    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
    于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
    这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

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

     

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

     

    2.细查回车和换行

    记:在自己的实验中,需要把一个数据集(文本文件)转换成另一种格式(文本文件)。转换中,读取一行至结尾,没有理会最后的回车换行符,直接抛弃处理。在新格式的文本中,写一行后通过fprintf(fp,"A%d: continuous. |type: A ",i);中的 作为换行。生成格式看上去和要求的一模一样,但在处理程序调用新格式中的数据时,在这个换行处出了问题。getc(fp)到换行处,得到的是ascii码值为10的LF。根据我的处理程序要求,此处的换行应该能够直接跳过去。那么,到底是文本中换行符出了问题呢,还是我的程序处理出了问题?其实就是因为在回车换行符的认识上出了问题。

    一、回车,换行

    ASCII表中有对应的值。

    ASCII值

    字符

    控制字符

    010

    line feed

    LF

    013

    carriage return

    CR

    {feed:把纸放进打印机;给装置提供数据资料。流入,喂养}

    {carriage:在打印机上在下一页进纸前作准备的机械;打字机的进纸处;马车;运输}

    C语言中,它们有对应的转义字符表示。page48@[1]

    字符形式

    含义

    ASCII代码

    换行,将当前位置移到下一行开头

    10

    回车,将当前位置移到本行开头

    13

    在文本文件中 显示的效果有一些不同,在windows的notepad中 在显示中没有作用,在editplus和notepad+ +中显示有换行的效果; 都显示有换行的效果;在linux下的VI下看到的效果是: 显示为^W, 没有对应显示字符。看到这里,很多人还是会云里雾里,我也是^_^.引用别人的一篇关于回车和换行区别的文章,相信很多朋友就明白了,详情参考[2],一针见血的文章让我忍不住要留在自己文章的下面:-)
    二、在我的程序中,需要的是每一行后面只有换行没有回车。但是在我写好的文件中莫名地出现了回车符。
     1 #include
     2 
     3 int main(int argc, char *argv[])
     4 {
     5 FILE *fp;
     6 if((fp=fopen("36TMpssm28.names","w"))==NULL)
     7 {
     8 printf("cannot open 36TMpssm28.names!");
     9 return -1;
    10 }
    11 fputs("+,-. ",fp);
    12 for(int i=1;i<=260;i++) 
    13   fprintf(fp,"A%d:  continuous. |type: A ",i); fclose(fp); 
    14 return 0; 
    15 }  
    这段程序写出的36TMpssm28.names中每行的结尾处是 两个字符。为什么呢?原因是上面为写文件打开的是文本文件方式,存在转换的问题。在向计算机输入文本文件时,将回车换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。313@[1] 
    结论: 1、回车和换行可分可合。在文件中合,在内存中分。 2、在文件读写时,文本文件方式有字符转换发生;二进制文件方式完全一一对应,没有字符转换。
    [1]谭浩强 C程序设计 第二版 清华大学出版社
    [2]http://www.cppblog.com/gtwdaizi/articles/38229.html
    ps:
     今天,我总算搞清楚“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别了。
    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
    于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
    这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
    后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
    Unix 系统里,每行结尾只有“<换行>”,即“ ”;Windows系统里面,每行结尾是“<回车><换行>”,即“  ”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

    c语言编程时(windows系统)

     就是return 回到 本行 行首 这就会把这一行以前的输出 覆盖掉

    如:

    int main() {

    cout << "hahaha" << " " << "xixi" ;

    }

    最后只显示 xixi 而 hahaha 背覆盖了

     是回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉

    int main() {

    cout << "hahaha" << " " << "xixi" ;

    }

     显

    hahaha

    xixi

     

    小总结:

    1.  首先理解文本文件和二进制文件的区别。

    2.  澄清一个在不同版本上的介绍回车换行符时对在windows上的误导,回车换行符在内存中的顺序是 <回车><换行>

    3.  向文件写数据时把换行符转换成 , 在从文件中读数据时把 转换成  可以很直接从UE中看到每一行的换行符有 0D 0A.

    4.  通过函数fgetws()方式读来的每一行数据已经把 转换成了 , 读入的字符是n-1需要注意一下。

    5.  在文件的结尾处因为没有回车换行了,但是文件的结尾没有多余的字符标志,同样按n-1个字符读取的时候就出现了问题。导致少读了一个字符。

     

     

    补充一点文件知识:

    这里指的文本是用于Windows系统中的扩展名为.txt的文件。

      Notepad(记事本)只支持四种格式:ANSI/Unicode/Unicode big endian/UFT-8,如何判断与读取这些不同格式的文本呢?

      首先,不同编码的文本,是根据文本的前两个字节来定义其编码格式的。定义如下:

      ANSI:        无格式定义;

      Unicode:       前两个字节为FFFE;

      Unicode big endian: 前两字节为FEFF; 

      UTF-8:        前两字节为EFBB;

    ANSI:系统预设的标准文字储存格式。ANSI是American National Standards Institute的缩写。它成立于1918年,是一个自愿性的组织,拥有超过1300个会员,包括所有大型的电脑公司。ANSI专为电脑工业建立标准,它是世界上相当重要的标准。

      Unicode:世界上所有主要指令文件的联集,包括商业和个人电脑所使用的公用字集。当采用Unicode格式储存文件时,可使用Unicode控制字符辅助说明语言的文字覆盖范围,如阿拉伯语、希伯来语。用户在“记事本”中输入含有Unicode字符的文字并储存文件时,系统会提示你必须选取“另存为”中的Unicode编码,这些字符才不会被遗失。需要提醒大家的是,部分 Windows 2000字型无法显示所有的Unicode字符。如果发现文件中缺少了某些字符,只需将其变更为其它字型即可。

      Unicode big endian:在Big-endian处理器(如苹果 Macintosh电脑)上建立的Unicode文件中的文字位元组(存放单位)排列顺序,与在Intel处理器上建立的文件的文字位元组排列顺序相反。最重要的位元组拥有最低的地址,且会先储存文字中较大的一端。为使这类电脑的用户能够存取你的文件,可选择Unicode big-endian格式。

    UTF-8:UTF意为通用字集转换格式(Universal Character Set Transformation Format),UTF-8是Unicode的8位元格式。如果使用只能在同类位元组内支持8个位元的重要资料一类的旧式传输媒体,可选择UTF-8格式。

  • 相关阅读:
    P1182 数列分段`Section II` 二分
    洛谷 P1025 数的划分
    深浅拷贝
    数据的内置方法
    控制流程-if/while/for
    python的基本运算符
    花式赋值
    python的注释
    Python的垃圾回收机制
    变量与常量
  • 原文地址:https://www.cnblogs.com/del88/p/5442697.html
Copyright © 2020-2023  润新知