[C/C++] 如何判断文件内容是否带中文标点符号

读取文件内容的时候需要判断内容是否是中文,同时有可能还需要判断是否带有中文标点符号,这里简单说明一下识别方法。

直接上代码:

#include <iostream>
#include <istream>
#include <fstream>
#include <sstream>
#include <algorithm>

bool readFile(std::string strPath)  
{
    int nNormal;
    int nFormatErr;
    std::string strLine;

    // 文件路径为空.
    if (strPath.empty())
    {
        //file path is empty
        return false;
    }

    // 打开文件
    ifstream fp(strPath.c_str(), ios::in);
    if (fp.fail())
    {
        //file open failed;
        return false;
    }

    //解析文件
    while (getline(fp, strLine))
    {
        //格式校验
        if (!Check(strLine))
        {
            //格式错误
            nFormatErr++;
        }
    }
    
    fp.close();
    return true;
}

bool Check(const std::string strContent)
{
    UINT16 i;
    std::wstring wstrContent;

    //将内容转换为宽字符
    wstrContent = string2wstring(strContent);

    for (i = 0; i < wstrContent.length(); i++)
    {
        if ((UINT16)wstrContent[i] > 0x80)
        {
            //宽字符
            if ((iswpunct(wstrContent[i])) || (iswspace(wstrContent[i])))
            {
                return false;
            }
        }
        else
        {
            //ASCII
            if ((wstrContent[i] > '0') || (wstrContent[i] < '9') || (ispunct(wstrContent[i])))
            {
                return false;
            }
        }
    }

    return true;
}

std::string wstring2string(std::wstring wstr)
{
    std::string result;
    int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);
    if (len <= 0)return result;
    char* buffer = new char[len + 1];
    if (buffer == NULL)return result;
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);
    buffer[len] = '\0';
    result.append(buffer);
    delete[] buffer;
    return result;
}

std::wstring string2wstring(std::string str)
{
    std::wstring result;
    int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
    if (len < 0)return result;
    wchar_t* buffer = new wchar_t[len + 1];
    if (buffer == NULL)return result;
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
    buffer[len] = '\0';
    result.append(buffer);
    delete[] buffer;
    return result;
}

wstring2string 和 string2wstring 是常规的一个wstring和string的转换函数,网上也有很多类似的,就不多说。

这里判断符号主要用到几个关键函数。

iswpunct(wint_t ch)

用于检查传递的宽字符是否为标点符号。如果不是标点符号,则返回零,否则返回非零值。

需要声明 “cwctype”头文件。

iswspace(wint_t ch)

检查宽字符是否为空格,在头文件“wctype.h”中。

如果宽字符是空白字符,则为非零值,否则为零。

int ispunct(int c)

检查参数c是否为标点符号或特殊符号。返回TRUE也就是代表参数c为非空格、非数字和非英文字母。

头文件: c--<type.h>   c++ -- <cctype> 

若参数c为标点符号或特殊符号,则返回TRUE,否则返回NULL(0)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值