蛋疼的回车换行(CR/LF)
如果你将一个linux系统上的文件拷贝到windows下使用,可能会遇到换行回车问题。
我今天就遇到了这个问题,一个来自于linux系统上mif文件(文本文件),导致我的程序崩溃。
我在代码里面调用了"fscanf fseek ftell"函数,然后就导致了文件指针混乱。
导致这种混乱的根本原因是在linux和windows上表示回车换行的方式不一致,windows用两个字节表示,而linux上用一个字节表示。
------------------------
回车【 CR(carriage return)】 换行【LF(line feed)】
Dos和windows采用回车+换行(CR/LF)表示下一行 \r\n 0x0d0a
UNIX/Linux采用换行符(LF)表示下一行 \n 0x0a
苹果机(MAC OS系统)则采用回车符(CR)表示下一行 \r 0x0d
------------------------
因此,在跨操作系统读写文件时(包括编写网络程序时),要注意这个问题。
×××××××××××××××
可以使用下列代码来实现文件的回车处理:
bool converterFile(const CString& fullPath) { FILE* pf = fopen((LPCTSTR)fullPath, "rb"); if (!pf) return false; long fBegin = ftell(pf); fseek(pf, 0, SEEK_END); long fEnd = ftell(pf); long fileSize = fEnd - fBegin; fseek(pf, -1*fileSize, SEEK_END); unsigned char* newFile = new unsigned char[2*fileSize]; memset(newFile, 0x00, 2*fileSize); long idx = 0; unsigned char aChar = 0x00; while(!feof(pf)) { fread(&aChar, 1, 1, pf); if (aChar==0x0d){ newFile[idx++] = 0x0d; fread(&aChar, 1, 1, pf); if (aChar!=0x0a) newFile[idx++] = 0x0a; } else if (aChar==0x0a) newFile[idx++] = 0x0d; newFile[idx++] = aChar; } fclose(pf); FILE* pNewFile = fopen((LPCTSTR)(fullPath), "wb"); if (!pNewFile) { delete []newFile; return false; } fwrite(newFile, 1, idx, pNewFile); fclose(pNewFile); delete []newFile; return true; }