\r\n <->\r转换

简介:

 

Windows/DOS与Unix文件格式是不同的,问题一般就是出在/r/n问题上。

回车(CR)和换行(LF)符都是用来表示“下一行”的。而标准没有规定要使用哪一个。于是产生了三种不同的用法:Dos和windows采用回车+ 换行(CR+LG)表示下一行(亦即所谓的PC格式,谁让MS最早雄踞PC市场呢,^_^),UNIX采用换行符(LF)表示下一行,MAC机采用回车符(CR)表示下一行。当在不同的系统间传递文件,就要涉及格式的转换。

先搞清楚几个符号
*******************

0D   CR   ^M   回车
*******************

DOS/Windows文本文件中使用CR(回车\r)和 LF(换行\n),
在文件的行尾的情况是是 '\r\n'

UNIX文本只使用换行符,在行的末尾有一个换行(\n),也就是'\n'
所以在windows下编辑的C程序放在unix下编译会出现"No end of newline"的Warning

两种文件格式之间的转化
Unix -> Dos
'\n' -> '\r\n'

//////////////////////////////////////////
      
        while ( (ch = fgetc(in)) != EOF )
        {
            if ( ch == '\n' )
                putchar('\r');
            putchar(ch);
        }
     
//////////////////////////////////////////

只要在Unix文件中出现的'\n'的之前加入一个'\r'字符就可以了

Unix <- DOS
'\n' <- '\r\n'

从Dos到Unix的情况复杂点,不能只是把从文件中读出的'\r'去掉就可以了
因为Dos文件中的文本行的末尾有时会内嵌一个回车符号,这种情况在击打式打印机中出现。
所以在转换前要判断'\r'是否和'\n'同时出现。
如果同时出现,则去掉'\r'
如果没有同时出现,保留'\n'

//////////////////////////////////////////
     
        cr_flag = 0;    /* No CR encountered yet */
        while ( (ch = fgetc(in)) != EOF )
        {
            if ( cr_flag && ch != '\n' ) {
                /* This CR did not preceed LF */
                putchar('\r');
            }
            if ( !(cr_flag = (ch == '\r')) )
                putchar(ch);
        }

Java中获取行结束符:System.getProperty("line.separator")



本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/639716,如需转载请自行联系原作者

相关文章
|
1月前
|
编译器 C++
47不同类型数据间的转换
47不同类型数据间的转换
5 0
|
8月前
|
存储 Python
什么是数据类型,都有什么,如何转换
什么是数据类型,都有什么,如何转换
111 0
|
9月前
|
C#
C#之里氏转换
C#之里氏转换
58 0
|
10月前
|
C语言 C++
C++——数据类型之间的转换
C++——数据类型之间的转换
XWindow与GtkWindow的转换
XWindow与GtkWindow的转换
66 0
|
JSON JavaScript C语言
转换类型的那些事儿
转换类型的那些事儿
88 0
|
存储 程序员 C++
C++学习——数据类型(强制)转换详解
C++学习——数据类型(强制)转换详解
418 0
C++学习——数据类型(强制)转换详解
|
Unix
weppy格式的转换
weppy格式的转换
119 0
|
JavaScript 前端开发 开发者
13、数据类型的转换
JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。
117 0