可可西

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

posted on   可可西  阅读(1521)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

统计信息

点击右上角即可分享
微信分享提示