您的位置:首页 > 运维架构 > Linux

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

2016-08-27 13:43 162 查看

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

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

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

什么意思呢?

例如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中用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: