Windows与Linux文本文件传输\r\n的那些事儿

Windows与Linux文本文件传输\r\n的那些事儿

我们常常需要在windows与linux之间相互传送文本文件,但会发现,由linux向windows传送过来的文本文件,打开后所有内容都是堆在一起的,没有回车和换行,格式表现很不好。

究其原因,是linux中用\n来作为换行符,而windows中使用\r\n作为换行符。

什么意思呢?

例如windows下的一个txt如下:

windows.txt

实际在磁盘上是什么呢,我们可以用ultraedit打开来看看:

这里写图片描述

看到了吧?0x61是我们写入的’a’,0x62是我们写入的’b’,之间有一个回车换行,实际上是0x0d 0x0a,也就是\r \n啦。

现在我想要把这个windows下的文件传送到linux系统中,我这里使用的工具是Xftp,具体怎么使用不在这里叙述,大家可以自己找一个教程,很简单。

我把这个文件在linux下用vim打开,如下所示:

这里写图片描述

和在windows上显示的一样。

然后在命令模式下用十六进制查看(:%!xxd),如下图所示:

这里写图片描述

和我们在windows下用ultraedit看的一样。

也就是说,虽然在vim中能正确地对windows中传输过来的文件显示,但本质上,文件中还是\r\n的形式,只是显示的时候由vim帮我们做了屏蔽,我们感觉上是一样的。

现在我们做另外一个实验,把linux中的一个文件传输到windows中,看看能否正确显示。

以下是linux中的一个文件:

linux.txt

我们先在linux中用vim以16进制显示一下:

这里写图片描述

可以看到efgh四个字母之间都是0x0a来作为回车换行的。

先在把这个linux系统中的文件传送到windows下来用记事本打开:

这里写图片描述

发现问题了吧,在linux和在windows对同一个文件显示不一样。

我们在用ultraedit打开看看:

这里写图片描述

和在linux下用vim 16进制看到的一样。

看到这里相信你已经明白为什么了,因为我们在linux下按一下回车,是产生了一个0x0a字符,而文件在windows中显示的时候,是见到一对0x0d 0x0a才显示一个换行,这就导致我们在windows下看linux中文本文件的问题了。

怎么解决呢?

我来贴两个很简单的小代码,供大家参考一下:

1.把windows文本文件转换成linux文本文件:

#include <stdio.h>
#include <stdlib.h>

int windowsToLinux(char *src,char *dest){

    char ch;

    FILE *srcFile,*destFile;
    srcFile = fopen(src,"rb+");
    destFile = fopen(dest,"wb+");

    if(srcFile == NULL || destFile == NULL){
        printf("open file error!\n");
        return 0;
    }

    while(fread(&ch,sizeof(char),1,srcFile)){
        if(ch == '\r'){
            //donothing!
        }else{
            fwrite(&ch,sizeof(char),1,destFile);
        }
    }

    fclose(srcFile);
    fclose(destFile);

    return 1;
}

int main(char argc,char *argv[]){

    if(argc != 3){
        printf("usage:windowsToLinux sourceFile destFile\n");
        exit(1);
    }

    windowsToLinux(argv[1],argv[2]);

    return 0;
}

2.把linux文本文件转换成windows文本文件:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int linuxToWindows(char *src,char *dest){

    int count;
    char ch;

    char standard[2] = {'\r','\n'};

    FILE *srcFile,*destFile;
    srcFile = fopen(src,"rb+");
    destFile = fopen(dest,"wb+");

    if(srcFile == NULL || destFile == NULL){
        printf("open file error!\n");
        return 0;
    }

    while(fread(&ch,sizeof(char),1,srcFile)){
        if(ch == '\n'){
            fwrite(standard,2,1,destFile);
        }else{
            fwrite(&ch,sizeof(char),1,destFile);
        }
    }

    fclose(srcFile);
    fclose(destFile);

    return 1;
}

int main(int argc,char *argv[]){

    if(argc != 3){
        printf("Format error!\n");
        printf("usage:linuxToWindows sourceFile destFile\n");
    }

    int result;

    result = linuxToWindows(argv[1],argv[2]);

    if(result == 1){
        printf("convert success!\n");
    }else{
        printf("convert error!\n");
    }

    return 0;
}

有很多童鞋开始犯愁了,linux和windows之间传输文本太麻烦了,还要额外的转化不同平台上的回车换行。

有没有简单一点的办法呢?

当然有啦,大家可以使用我上面提到了ultraedit这个编辑软件。

当大家是从FTP打开的linux的文件,如下所示:

这里写图片描述

那么,你实际编辑是在windows下,当打开一个linux的文本文件时,ultraedit会 帮你“格式化”,他会见到\n就显示一个换行,不像在windows下一定要见到一对\r\n才换行,嘿嘿,是不是很方便呀?

但是注意,我看到的是在windows下编辑一个文件,同步到linux的时候,ultraedit不会帮我们把\r\n转换成\n。大家可以回去试一试。

以上内容如有错误,敬请各位看官指出,小弟不胜感激~~

参考资料:
1.http://www.cnblogs.com/zhyg6516/archive/2010/11/11/1875231.html

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值