可可西

蛋疼的回车换行(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;
}

posted on 2011-06-21 17:38  可可西  阅读(1513)  评论(0编辑  收藏  举报

导航