【转载】 C++中回车换行(\n\r)和换行(\r)的区别

原文:http://blog.csdn.net/xiaofei2010/article/details/8458605

windows下的点一下回车,效果是:回车换行,就是\r\n

unix系统下的回车一下就是一个\n

给出如下代码:

#include <iostream>
using namespace std;  

int main()
{
    cout << "this is the first line\n";
    cout << "this is the second line\r";
    cout << "this is the third line\n";
    cout << "this is the fouth line\r";
    cout << "this is the fifth line\n";
    cout << "end" ;
    return 0;
}  

运行结果如下:

回车换行(\n\r):每次光标移到下一行的行首位置处;

换行(\r):每次光标移到本行的行首位置处。

另见:

回车、换行的区别

他们间的区别其实是个回车换行的问题

先来段历史

回车”(Carriage Return)和“换行”(Line Feed)这两个概念的来历和区别。

符号        ASCII码        意义

\n               10          换行

\r                13            回车CR

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

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

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

在Windows中:

‘\r‘ 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;

‘\n‘ 换行,换到当前位置的下一行,而不会回到行首;

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

例:

$ echo -en ‘12\n34\r56\n\r78\r\n‘ > tmp.txt

分别在Windws和Linux中查看此文件可知:

Linux中遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^M")显示,不发生回车的操作。而windows中要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一行。

另见:

回车的传说---兼谈\n\r区别(转载)

如果你有在windows下编程的经验就会发现windows下敲下回车键会产生两个字符CR和LF,用16进制编辑器打开windows下的文本文件也会看到换行是0D和0A表示的,也就是CR和LF的ASCII编码。而在UNIX类系统中换行只有一个字符LF,所以UNIX中的文本文件在windows中用记事本打开会出现不可解析字符且丢失换行格式,所有字符连成一行。
    因为windows下的记事本读到LF时不知道这就是换行(只有CR和LF连续出现才能解释为换行),于是当作不可打印字符处理,就是一个黑色方框。CR和LF分别表示“回车”(carriage return)和“换行”(line feed),ASCII编码为13和10,在C语言中用\r和\n表示。
    为什么windows下要用两个字符表示换行?这就是今天要讲的故事:《回车的传说》
    在计算机刚刚诞生之时,广泛使用Teletype公司制造的一种古老的终端(console terminal)电传打字机ASR33。ASR33每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,打印头从行尾移到行首再下移一行要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失,那时可没有缓冲区暂存。Teletype的研究人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
下面是一些参考资料:
History of The Teletype Corporation
http://www.kekatos.com/teletype/
The Teletype Corporation ASR 33 Teletype (1967).

( 1968年盖茨在湖滨中学玩的就是这种机器,他们通过这种终端编写BASIC程序。因为 ASR 33只使用大写字母,所以BASIC程序以大写字母为主)
    后来,计算机的史前时代结束了,小型机诞生了,现代文明的键盘也发明了,但回车和换行的概念仍被保留下来。一些计算机设计者认为在每行结尾加两个字符太浪费也没有必要了,加一个就可以。于是就出现了分歧。
    Unix系统里使用<line feed>表示换行,每行结尾只有一个换行符\n,MSDOS和Windows系统里面每行结尾是<回车><换行>(<carriage return><line feed>)即\r\n,Apple的Mac系统里每行结尾是<回车>(<carriage return>)即\r。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,某些文本编辑器可能在每行的结尾会多出一个^M符号。
   本人觉得用两个字符表示换行实在有些画蛇添足,但是在网络的世界里这一现象却大量存在,不少网络协议规定报文必须使用CR-LF换行模式。
你怎么看呢?前不久在CU的论坛对这一问题进行了讨论:http://bbs2.chinaunix.net/thread-1067432-1-1.html
这个和编程有关系吗?
有的,但是在标准C里通常情况下是体会不到的,标准C的流提供系统无关抽象层。
可以在windows系统中进行一下实验:
    
程序一:
----------------------------------------------

#include <stdio.h>
int main(void)
{
        int i;
        FILE *fp;
        if((fp=fopen("test.txt","w")) == NULL)
        {
                fprintf(stderr,"open file error\n");
                return 1;
        }  

        for(i=0;i<100;i++)
                fprintf(fp,"test\n");  

        fclose(fp);  

        return 0;
}  

程序二:
-------------------------------------------------------------------------------------

[cpp] view plaincopyprint?

#include <stdio.h>
int main(void)
{
        int i;
        FILE *fp;
        if((fp=fopen("test.bin","wb")) == NULL)
        {
                fprintf(stderr,"open file error\n");
                return 1;
        }  

        for(i=0;i<100;i++)
                fprintf(fp,"test\n");  

        fclose(fp);  

        return 0;
}  

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

程序一输出文件大小是600字节,程序二输出文件大小是500字节,用记事本打开程序一的输出没有什么问题,每行一个test,打开程序二的输出发现所有的test连成一行,test之间是一个黑色方框符号分隔。用UltraEdit-32以16进制编辑模式打开test.bin可以查看到黑色方框符号就是0A也就是\n,打开test.txt则会发现换行是\r\n,这就是两个文件大小相差100字节的原因。Unix类系统用户打开windows中的文件就会遇到这种苦恼。
为什么会有这种区别呢?
    毕竟是源自Unix系统,C语言中使用\n表示换行,而在实际的文件中换行符号需要同操作系统一致,所以当我们在C中使用fopen打开一个文本文件时流实现了实际换行符与C中\n之间的转换。在windows中当我们用fopen打开文本文件,然后从中读到\r\n时流会转换为\n,而当我们往文件中写入\n时流会转换为\r\n。程序一是打开文本文件,程序二打开的是二进制文件,因为流只对文本文件进行换行表示的转换,以二进制模式打开流不会做任何处理。所以当你以二进制模式打开一个文本文件时将产生错乱,你必须亲自将\r\n解释为\n,同样的问题也会出现在以文本模式打开二进制文件的情况.这也解释了为什么Unix类系统中的文件不区分文本文件和二进制文件的原因。
  
当我们使用标准输入输出函数时有这种情况吗?  
再回到我们熟悉的标准输入输出stdin,stdout
    C的控制台程序在加载进内存成为进程运行前C运行时库自动打开三个设备并关联到三个流:标准输入流stdin,标准输出流stdout,标准出错流stderr
    通常在通用计算机中,没有重定向前这三个流对应的设备是:键盘,显示器,显示器。这三个都是字符设备,所以是以文本文件的模式打开的,在windows下当我们在键盘上敲入回车键时产生字符\r\n,但是在OS内核把键盘驱动中读到的字符发送给流的缓冲区时流会将之转换为\n,当我们向控制台输出\n时流将之转换为\r\n再传递至内核,当我们绕过标准输入输出直接调用windows中coredll.lib进行控制台输入输出时就必须面对这一现实,程序员负责实现这一转换。

——————————————————————————————————————————————————————

其他解释:/r 回车符  /n 换行符  其中 /r的码值是13 ,谢谢^_^详细的看看下面的说明:MS-DOS文本文件用回车符和换行符的组合\r\n表示行尾。Macintosh文本文件使用只用一个回车符\r来表示行尾。C程序使用\n表示行尾。所以,在C程序以文本方式打开一个MS-DOS文本文件时,会将\r\n转换为\n,在写入文件的时候它会将\n转换为\r\n。(如果以二进制方式打开该文件,则C程序将看到\r和\n两个字符。)而对于Macintosh文本文件的文本视图,在读取文件时它会将\r转换为\n,在写入文件的时候它会将\n转换为\r
\n是换行符,但不会刷新缓冲区endl在输出一个换行符后,立即刷新缓冲区,这样不管缓冲区有没有被写满,数据都直接发送到输出设备

c语言 - 回车符和换行符

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

  在Windows环境中,如果输入到文本文件,程序中的一个‘\n‘换行符被解释成‘\r‘、‘\n‘两个字符(会车、换行);相反,如果读取文本文件,文件中的相邻的两个‘\r‘、‘\n‘会合并为一个‘\n‘输出。但是在Unix/Linux环境下,‘\n‘就是‘\n‘,保持不变。

  因此,Windows下的文本文件和Unix/Linux下的文本文件的格式是不同的,其原因就在于对于程序中的‘\n‘换行符的解释不同。‘\n‘,(换行符)是换行走纸,没有回车,回车是由‘\r‘实现 。  在UNIX中,早期的输入通常是穿孔机,没有什么回车概念。在DOS中,由于是屏幕输入,通常就有了‘\r‘‘\n‘的区别,为了保证每次换行都能从头开始,DOS中的换行符通常会被存储为‘\r\n‘。

\r与\n的区别,\r\n与\n或\r的区别(C语言/C#)

本文出处http://topic.csdn.net/t/20020718/07/882679.html  原作者:triout(笨牛)

\r表示回车,\n表示换行,我们按回车按钮的时候,系统自动产生回车和换行两个字符:   
  回车仅仅是表示完成,把光标回到行首,   
  换行仅仅是换行,不表示完成,也不把光标放到行首。   
  示例:(下面用I表示光标)   
  1——   
  输出abcdef后:   
  abcdefI   
  2——   
  输出回车后:   
  Iabcdef   
  2——‘   
  如果是输出换行:   
  abcdef   
              I   
  3——   
  输出回车和换行:   
  abcdef   
  I   
  可用C语言来测试回车与换行的区别:假设当前光标的位置是5行10列,输出回车后,光标位置变为5行1列,如果输出的是换行则是6行10列,如果输出回车和换行则是6行1列。   
  如果你要想输出\r或\n这样的内容,你需要使用这样的方法:   
  Console.Write("\\r\\n");   
  或   
  Console.Write(@"\r\n");   
  输入回车后,产生的两个字符回车和换行

C语言中换行符和回车符的区别(转)

换行(\n)将当前位置移动到下一行开头。

回车(\r)将当前位置移动到本行开头。

退格(\b)将当前位置移动到钱一列。

Enter键按下后会执行\n\r这样就是我们看到的一般意义的回车了,所以你用16进制文件查看方式看一个文本,就会在行尾发现"\n\r"Tab是制表符,就是"\t",作用是预留8个 字符的显示宽度,用于对齐。

----------------------------------------------------------------------------------
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人 
员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了 分歧。  
Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。  
 
在ascii中,回车和换行是不同的字符。0x0A是回车,即光标移动到本行的最左面; 0x0D是换行,即光标移动到下一行。  
  
在dos窗口中按回车键,其实是输入了两个字符0x0A,0x0D,对应到c中,就是\r(回车)\n(换行)   
在C语言中  
将 \n 存入文件  window: 0d 0a

unix: 0d  
如果不存到文件中,不会变。  如果从文件中提取,  windows: 0d 0a -> \n  unix : 0d -> \n 
回车键,即键盘上的ENTER键,是一个比较有用的键,在文字编辑时,回车键的作用是换行,在输入网址时回车键的作用是“转到”,在执行DOS命令时,回车键的作用是执行„„  
在标准键盘上,回车键一共有2个,一个在主键盘区的右边,Shift键的上面,一个在小键盘的右下角,加号键的下面。   
回车键的历史   
关于“回车键”的来历,还得从机械的英文打字机说起。在打字机上,有一个部件叫“字车”,每输入一个单词,“字车”就前进一格。当输满一行后,使用者就要推动“字车”到起始位置,这时打字机会有两个动作:“字车”归位、滚筒上卷一行(相当于“字车”下移一行),以便开始输入下一行,这中推动“字车”的动作叫“回车”。后来,在电动的打字机上,人们增加了一个直接起“回车”作用的键。他被称为“回车键”。  
  在现今的电脑键盘上,“回车键”上曾使用过“CR”、“RETURN”的字样,后来才统一确定为“Enter”。   
回车的ASCII代码   
16进制是“0x0d”  10进制是“13”  
在某些语言中可以用‘\r’表示。 
如果用过机械打字机,就知道回车和换行的区别了。。。  换行就是把滚筒卷一格,不改变水平位置。  回车就是把水平位置复位,不卷动滚筒。    
但是我们平时按得Enter到底是回车还是换行,不太清楚??  
看到一种说法:windows下enter是 \n\r,unix下是\n,mac下是\r   
在MS的系统中纯文本格式按一个回车键是输入了两个字符,一个回车一个换行。在LINUX系统中则只是一个回车。  
//以上内容参考了http://topic.csdn.net/t/20040617/23/3101951.html#和http://topic.csdn.net/t/20021113/09/1171659.html的讨论   
还有在编程时文件操作

wb(二进制方式)或者wt(文本方式)也会有影响。我做了个实验(实验用.net2003)  在01.txt文件中输入12然后enter,在ultraedit中看到的二进制是31 32 0d 0a   
然后程序如下:   
int mian()  
{ FILE *fp1,*fp2,*fp3,*fp4,*fp5,*fp6;   
char a[10];  char b[10];   
fp1 = fopen("01.txt","r");  fp3 = fopen("02.txt","w");  
fread(a,sizeof(unsigned char),8,fp1); //a里是31 32 0a  
fwrite(a,sizeof(unsigned char),8,fp3); //02.txt里是31 32 0d 0a ,原因是输入的情况下,换行回车转换成换行,然后输出时换行又会 
转成换行回车  fclose(fp1);  fclose(fp3);   
fp2 = fopen("01.txt","rb");  fp4 = fopen("03.txt","wb");  
fread(b,sizeof(unsigned char),8,fp2); //b里是31 32 0d 0a  
fwrite(b,sizeof(unsigned char),8,fp4); //03.txt里是31 32 0d 0a ,原因是二进制情况下回车和换行的(类似文本方式的那种转换)是不存在的  fclose(fp2);  fclose(fp4);   
return 0;  }  
好像结论是这样的:读的方式下,在文本方式下,enter是0x0a;在二进制方式下,enter是0x0d,0x0a。   
MSDN中查到这样的话:Also, in text mode, carriage return–linefeed combinations are translated into single linefeeds on input, and linefeed characters are translated to carriage return–linefeed combinations on output. (输入的情况下,换行回车转换成换行,然后输出时换行又会转成换行回车)When a Unicode stream-I/O function operates in text mode (the default), the source or destination stream is assumed to be a sequence of multibyte characters. Therefore, the Unicode stream-input functions convert multibyte characters to wide characters. For the same reason, the Unicode stream-output functions convert wide characters to multibyte

characters.   
Open in binary (untranslated) mode; translations involving 
carriage-return and linefeed characters are suppressed. (二进制情况下回车和换行的转换是不存在的).   
再引用一篇:http://zhidao.baidu.com/question/27868102.html?fr=qrl3   
软硬回车 }   
硬回车就是普通我们按回车产生的,它在换行的同时也起着段落分隔的作用。  软回车是用 Shift + Enter 产生的,它换行,但是并不换段,即前后两段文字在 Word 中属于同一“段”。在应用格式时你会体会到这一点。    
切换:   
编辑——替换,点击高级,在“查找内容”点入“特殊字符”中的手动换行符,再在“替换为”中点入“特殊字符”中的段落标记,最后点击全部替换。      
键盘上只有一种回车键Enter,但却有两种不同性质的换行标记,不能不说是一个奇迹。   
我们常用的回车是硬回车,就是在word中敲击Enter键产生的那个弯曲的小箭头,占两个字节。这种回车可以有效地把段落标记出来分清楚。在两个硬回车之间的文字自成一个段落,可以对它单独设置段落标记而不用担心其他段落受到影响。这也是我们习惯用硬回车的原因:排版方便。   
但是硬回车也给我们带来了麻烦。你如果是网页设计者,或者是论坛游侠,一定有这样的经历:当你打算换行时,换出的行却实在不能恭维,行间距太大了!其实这和硬回车的原理是一样的,只不过在word等文本编辑器中没有显示出它的“本来面目”。不过这样的排版的确造成了不小的困难,这时我们就得请出硬回车的兄弟:软回车。   
软回车只占一个字节,在word中是一个向下的箭头。如果你从很复杂的网页中向word中复制过文字的话,对它一定不会陌生。但是想在word中直接输入软回车可不是那么容易的。因为软回车不是真正的段落标记,它只是另起了一行,不是分段。所以它不是很利于文字排版,因为它无法作为单独的一段被赋予特殊的格式。但是尽管如此,它在网页设计中还是具有举足轻重的地位的。   
软回车能使前后两行的行间距大幅度缩小,因为它不是段落标记,要和法定的段

落标记——硬回车区别出来。硬回车的html代码是<p>..</p>,段落的内容就夹在里面,而软回车的代码很精悍:<br>。因此在网页中想用到软回车,只需切换到代码页面,键入软回车的代码即可。  
下面我讲一下不同编辑器文字互相拷贝时回车的转化情况。   
地球人都知道的,网页的文字如果复制到word中,则硬回车变为弯曲的箭头,软回车变为向下的箭头。结果造成习惯用word编辑文本的朋友很不习惯很不舒服的情况。   
word中的文本复制到网页中也是同样的道理。可以说word和网页比较兼容的,要不怎么会有“保存为web页”这种选项呢?   
记事本也是大家摸的比较多的编辑器。但是近年来随着社会发展外加记事本的种种弊端,许多人都将其打入冷宫。对此我只能表示遗憾,因为记事本本身的功能不丰富就是别的编辑器所取代不了的优点。大家再次将网页的文字复制时,不妨粘贴到记事本里试试。哈哈,不管网页设计者用的是什么回车,现在都变成一种回车了!怎么,你不信?那就看看吧:软回车变成了普通的回车,硬回车变成了两个普通的回车。你再从记事本里复制文字到word,记事本里的回车无一例外全都变成了硬回车!你再再从记事本里复制文字到网页编辑器,所有回车就都变成软回车了!! 
\n是换行,英文是linefeed,ASCII码是0xA。  
\r是回车,英文是carriage return ,ASCII码是0xD。 
--------------------------------------------------------------------------------------------------------------------------- 回车的传说---兼谈\n\r区别(转载) 
IT文摘2010-08-31 11:40:24阅读86评论0 字号:中订阅 
如果你有在windows下编程的经验就会发现windows下敲下回车键会产生两个字符CR和LF,用16进制编辑器打开windows下的文本文件也会看到换行是0D和0A表示的,也就是CR和LF的ASCII编码。而在UNIX类系统中换行只有一个字符LF,所以UNIX中的文本文件在windows中用记事本打开会出现不可解析字符且丢失换行格式,所有字符连成一行。 
因为windows下的记事本读到LF时不知道这就是换行(只有CR和LF连续出现才能解释为换行),于是当作不可打印字符处理,就是一个黑色方框。CR和LF分别表示“回车”(carriage return)和“换行”(line feed),ASCII编码为13和10,在C语言中用\r和\n表示。 
为什么windows下要用两个字符表示换行?这就是今天要讲的故事:《回车的传说》 
在计算机刚刚诞生之时,广泛使用Teletype公司制造的一种古老的终端(console terminal)电传打字机ASR33。ASR33每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,打印头从行尾移到行首再下移一行要

时间: 2024-12-08 15:59:03

【转载】 C++中回车换行(\n\r)和换行(\r)的区别的相关文章

[转载]Java中的String,StringBuilder,StringBuffer三者的区别

最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下,便于大家观看,也便于加深自己学习过程中对这些知识点的记忆,如果哪里有误,恳请指正. 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String String

C++中回车换行(\n\r)和换行(\r)的区别

windows下的点一下回车,效果是:回车换行,就是\r\n unix系统下的回车一下就是一个\n 给出如下代码: [cpp] view plain copy print? #include <iostream> using namespace std; int main() { cout << "this is the first line\n"; cout << "this is the second line\r"; cou

Windows、Unix、Mac不同操作系统的换行问题-剖析回车符\r和换行符\n

转载链接:http://blog.csdn.net/tskyfree/article/details/8121951 一.概念: 换行符‘\n’和回车符‘\r’ (1)换行符就是另起一行  --- '\n' 10 换行(newline) (2)回车符就是回到一行的开头 --- '\r' 13 回车(return) 所以我们平时编写文件的回车符应该确切来说叫做回车换行符     二.应用: (1)在微软的MS-DOS和Windows中,使用“回车CR('\r')”和“换行LF('\n')”两个字符

一个用C#写的删除字符串中回车、换行、制表符、空格的程序

在使用知网CAJViewer(我用的版本是7.2.0 Build 111)查阅文献时,将文本复制Notepad中会产生多个换行,如下图所示: 毫无疑问,手工删除这里面的回车(\n).换行(\r).制表符(\t).空格都删去,是非常费时费力的.大约一个月前,我用C#写了一个非常简易的小工具来解决这个问题,今天我把这个工具的代码记录下来,方便日后使用. 程序界面如图: 这个程序的窗口被设定为总在最前,将CAJViewer中[选择文本]状态选中的文字,按Ctrl+C复制后,在程序文本编辑界面按下Ctr

菜鸟随笔(1)---Windows、Unix、Mac不同操作系统的换行问题 回车符\r和换行符\n

一只菜鸟横空出世,码农世界闯一闯,每天进展多一丢丢. Windows.Unix.Mac不同操作系统的换行问题 回车符\r和换行符\n 一.概念: 换行符'\n'和回车符'\r' (1)换行符就是另起一行 --- '\n' 10 换行(newline) (2)回车符就是回到一行的开头 --- '\r' 13 回车(return) 所以我们平时编写文件的回车符应该确切来说叫做回车换行符 CR: 回车(Carriage Return) \rLF: 换行(Line Feed) \n 二.应用: (1)在

如何使用multipart/form-data格式上传文件(POST请求时,数据是放在请求体内,而不是请求头内,在html协议中,用 “\r\n” 换行,而不是 “\n”)

在网络编程过程中需要向服务器上传文件.Multipart/form-data是上传文件的一种方式. Multipart/form-data其实就是浏览器用表单上传文件的方式.最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器. 表单形式上传附件 具体的步骤是怎样的呢? 首先,客户端和服务器建立连接(TCP协议). 第二,客户端可以向服务器端发送数据.因为上传文件实质上也是向服务器端发送请求. 第三,客户端按照符合“m

【C++】小心使用文件读写模式:回车(&#39;\r&#39;) 换行(&#39;\n&#39;)问题的一次纠结经历

原来没有仔细注意C++读写文件的二进制模式和文本模式,这次吃了大亏.(平台:windows  VS2012) BUG出现: 写了一个程序A,生成一个文本文件F保存在本地,然后用程序B读取此文件计算MD5值. 将该文件上传到服务器,再用程序B将文件从服务器上下载下来计算MD5值,神奇的发现两次计算的MD5值不一样,文件被谁改了?? 排除问题: 1.首先对比了生成文件F和上传到服务器的文件,发现文件复制过程无差错,是同一个文件. 2.用程序B下载文件F后,保存在本地,发现文件与原文件F不一致,对比二

dom4j: 生成XML时文本中回车换行无效

属性文本中回车换行在输出时被dom4j自动去掉了. 解决办法: 将format.setTrimText(false); 即可.因为 createPrettyPrint()方法中有 format.setTrimText(true); 问题就出在这里. 原文地址:https://www.cnblogs.com/yongdaimi/p/10319355.html

浏览器中回车(Enter)和刷新的区别是什么?[转载]

在浏览器中回车和F5刷新有什么区别那?今天就来说说:浏览器中回车(Enter)和刷新的区别是什么? 这点事. 概论: 1.回车在 Expires有效的时候,是不会去请求服务器的,打开调试看到的请求也只是伪造的,比如 谷歌浏览器可能显示 200(cached)(比正常的200多了) 其实是没有发起实际的缓存,直接读取本地硬盘缓存. 2.如果按了 f5则 Expires设置不再起效果,只有Last-Modified/ETag有效果,如果在缓存期间内则返回 304,再读取本地缓存内容 3.ctrl+f