zoukankan      html  css  js  c++  java
  • 蛋疼的回车换行(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;
    }
    
  • 相关阅读:
    delphi.数据结构.链表
    delphi.指针.PChar
    delphi.指针.应用
    delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同
    Delphi系统变量:IsMultiThread对MM的影响
    安装文件制作工具Wix概念快速入门
    [转]JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    Xiaohe-LeetCode 288 Unique Word Abbreviation
    Xiaohe-LeetCode 100 Same Tree
    Xiaohe-LeetCode 237 Delete Node in a Linked List
  • 原文地址:https://www.cnblogs.com/kekec/p/2086255.html
Copyright © 2011-2022 走看看