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;
    }
    
  • 相关阅读:
    java程序调用CMD命令启动tomcat替换环境变量
    解决mysql中只能通过localhost访问不能通过ip访问的问题
    mysql 主从配置
    maven私服上传jar包
    mysql 服务【安装】【启动】【停止】【卸载】【重置密码】
    spring boot 文件上传大小限制
    Mysql 字符串分隔函数
    上取整和下取整之间的转换关系
    chapter3 数据链路层
    Chapter2 物理层
  • 原文地址:https://www.cnblogs.com/kekec/p/2086255.html
Copyright © 2011-2022 走看看