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
相关文章推荐
- Linux那些事儿之我是U盘(43)迷雾重重的Bulk传输(一)
- Linux那些事儿之我是U盘(47)迷雾重重的Bulk传输(五)
- Linux的那些事儿(1)----Linux和UNIX以及和Windows的区别
- 答疑解惑:Linux与Windows的那些事儿(1)
- Linux与Linux,Linux与Windows之间使用SSH传输文件
- Linux和Windows系统之间的文件传输
- 利用securecrt在linux与windows之间传输文件
- OpenSSH实现Windows和Linux文件安全传输
- Linux那些事儿之我是U盘(47)迷雾重重的Bulk传输(五)
- 利用securecrt在linux与windows之间传输文件
- linux与linux,linux与windows之间用SSH传输文件
- Linux那些事儿之我是UHCI(24)等时传输
- Linux那些事儿之我是UHCI(22)Root Hub的中断传输
- 用pscp 在Windows与Linux之间传输文件
- 【转】Linux那些事儿之我是U盘(46)迷雾重重的Bulk传输(四)
- Linux那些事儿之我是U盘(46)迷雾重重的Bulk传输(四)
- Linux那些事儿之我是UHCI(20)非Root Hub的Bulk传输
- 【转】Linux那些事儿之我是U盘(43)迷雾重重的Bulk传输(一)
- 通过SSH(22)端口 传输文件工具 (windows -- Linux)
- 虚拟机中实现Linux与Windows之间的文件传输(转载)