蛋疼的回车换行(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
------------------------
因此,在跨操作系统读写文件时(包括编写网络程序时),要注意这个问题。
×××××××××××××××
可以使用下列代码来实现文件的回车处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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 ; } |
分类:
计算机理论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)