huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


lfread——读入文件到宽字节数组中


// 得到某字符串中的某字符串的个数
int findstrnum(const char* old_str, const char* find_str)
{
    const char* p;
    int num = 0;
    while (1)
    {
        p = strstr(old_str, find_str);
        printf("%s\n", p);
        while (p != NULL)
        {
            num++;
            p = p + strlen(find_str);
            p = strstr(p, find_str);
        }
        break;
    }

    return num;
}

/*
    GetCHSNum
    得到char*中中文的个数
    
    pchar    原字符串
    返回值    中文个数
\*/
int GetCHSNum(char pchar[])
{
    int num = 0;

    for (unsigned int i = 0; i < strlen(pchar); i++)
    {
        if (pchar[i] < 0)
        {
            num++;
            i++;
        }
    }

    return num;
}


// 宽字节读取器
size_t lfread(TCHAR* str, size_t size, FILE* fp)
{
    char* text = new char[size + 1];
    sprintf_s(text, 1, "");
    size_t i = fread(text, size, 1, fp);
    
    // 由于fread将中文当作一个字节读取,所以如果文件中包含中文,读出来的字符串末尾会含 <文件中的中文个数> 个乱码
    //
    // 所以这里要向下取整得到字符串中的中文个数,又因为末尾含 <文件中的中文个数> 个乱码,所以字符串中一半的中文都
    // 是乱码,所以要除以2,然后就得到了准确的中文个数,然后再将乱码的那部分删除,由于乱码位于末尾,就在尾部加\0
    // 截去乱码部分
    text[size - (GetCHSNum(text) - 1) / 2] = '\0';
    
    // char 转为 wchar_t
    MultiByteToWideChar(CP_ACP, 0, text, strlen(text), str, size - (findstrnum(text, "\n") + findstrnum(text, "\r")));
    delete[] text;
    return i;
}


和fread的用法几乎毫无差别,不过去掉了_ElementCount参数(原来在fread中的第三个参数,表示读入次数,此处默认设置为1)


请读取ANSI编码文件!否则中文乱码!


使用示例

    FILE* fp;
    
    // 打开文件
    if (fopen_s(&fp, "./read.txt", "rt+") != NULL)
    {
        throw;
    }

    // 保存文件内容
    TCHAR wch[1024] = { 0 };
    
    // 读入文件(使用宽字节读取器)
    lfread(wch, _filelength(_fileno(fp))/* 得到文件总长 */, fp);
    
    // 关闭文件
    fclose(fp);


fread_p——解决fread读取文件结尾出现乱码问题


确保你读取的是ANSI编码文件,否则中文还是乱码。

/*
    GetCHSNum
    得到char*中中文的个数

    pchar    原字符串
    返回值    中文个数
\*/
int GetCHSNum(char pchar[])
{
    int num = 0;

    for (unsigned int i = 0; i < strlen(pchar); i++)
    {
        if (pchar[i] < 0)
        {
            num++;
            i++;
        }
    }

    return num;
}


// 读取文件
size_t fread_p(char* str, size_t size, FILE* fp)
{
    sprintf_s(str, 1, "");
    size_t i = fread(str, size, 1, fp);
    str[size - (GetCHSNum(str) - 1) / 2] = '\0';
    return i;
}


用法和lfread一样,只不过是读取到char*中,和fread的最大区别就是没有乱码。



参考:

得到中文个数 http://www.huidong.xyz/index.php?mode=2&id=99 

MultiByteToWideChar函数:http://www.huidong.xyz/?mode=2&id=48

得到指定字符个数 http://www.huidong.xyz/index.php?mode=2&id=94 



返回首页


Copyright (C) 2018-2024 huidong