windows与linux换行符问题

    技术2022-05-19  23

    在Linux下的换行是/n,而在Windows下的换行是/r/n。不经过处理的话,两者的文件在显示的时候会出现问题,比如一个Linux的文本文件 用Windows记事本打开的时候不会换行格式很乱,一个Windows文件在Linux下用VI打开的话会出现^M字符

     

    windows文本文件用回车符和换行符的组合/r/n来表示行尾。

    linux/unix换行符为/n

    Mac文本文件用/r表示行尾

     

    C程序使用一个/n来表示行尾,所以,如果C程序以文本视图模式处理一个windows文本文件,在读取文件时它会将/r/n转换成/n,在写入文件的时候会将/n转化成/r/n.

    如果使用二进制视图,将不发生任何映射。

    下面这个程序用于处理/r/n和/r的转换的问题

    /* * Unix/DOS换行符转换程序 * auther:cm * date:2011-4-19 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /*函数声明*/ void usage(); //用法 void turndos(char *,char *); //将unix格式转换成dos格式 void turnunix(char *, char *);//将dos格式转换成unix格式 int main(int argc, char *argv[]) { if (argc != 4) { //参数错误 usage(); exit(0); } //printf("%s,%s",argv[2],argv[3]); //参数判断 if (!strcmp(argv[1],"-u")||!strcmp(argv[1],"-U")) turnunix(argv[2],argv[3]); else if (!strcmp(argv[1],"-d")||!strcmp(argv[1],"-D")) turndos(argv[2],argv[3]); else usage(); return 0; } void usage() { printf("/nUsage: ud -u|-U|-d|-D srcfile dstfile/n"); printf("/n-u|-U/tturn a dos/windows text to unix/linux form"); printf("/n-d|-D/tturn a unix/linux text to dos/windows form"); } void turnunix(char *srcfile,char *dstfile) { FILE *in,*out; char buf[1]; int read = 0; int flag; //以二进制形式打开文件 if ((in=fopen(srcfile,"rb")) == NULL) { printf("/nCan not open file %s",srcfile); exit(-1); } //判断文件是否已存在 if ((out=fopen(dstfile,"rb"))!=NULL) { fclose(out); printf("/nERROR! dstfile %s has been existed!",dstfile); exit(-1); } if ((out=fopen(dstfile,"wb"))==NULL) { printf("/nCan not create dstfile %s",dstfile); exit(-1); } /*处理程序*/ //从srcfile逐个复制字节到dstfile 效率有点低 不过先这么办吧/ /* * 原理:当遇到/r时,检查下一个是否为/n 如果为/n 则 回退一个字节覆盖掉/r写入/n */ flag = 0; while ((read=fread(buf,sizeof(char),1,in))>0) { if (buf[0] == '/r') flag = 1; else if (flag == 1 && buf[0]=='/n') { fseek(out,-1L,SEEK_CUR); //从当前位置回退一个字节 flag = 0; } fwrite(buf,sizeof(char),read,out); } fclose(in); fclose(out); } void turndos(char *srcfile, char *dstfile) { FILE *in,*out; char buf[1]; char ch = '/r'; int read = 0; //以二进制形式打开文件 if ((in=fopen(srcfile,"rb")) == NULL) { printf("/nCan not open file %s",srcfile); exit(-1); } //判断文件是否已存在 if ((out=fopen(dstfile,"rb"))!=NULL) { fclose(out); printf("/nERROR! dstfile %s has been existed!",dstfile); exit(-1); } if ((out=fopen(dstfile,"wb"))==NULL) { printf("/nCan not create dstfile %s",dstfile); exit(-1); } /*处理程序*/ /*遇到/n时,向文件中写入/r/n */ while ((read=fread(buf,sizeof(char),1,in))>0) { if (buf[0] == '/n') { fwrite(&ch,sizeof(char),1,out); } fwrite(buf,sizeof(char),read,out); } fclose(in); fclose(out); }


    最新回复(0)