嗯嗯好吧 2017-05-07 13:20 采纳率: 11.1%
浏览 2788

c++如何读取字符串汉字

c++如何读取文本文件中的汉字,通过wifstream和locale

  • 写回答

1条回答

  • RDS__ 2017-05-07 13:43
    关注

    我之前写了一个MFC程序,用来统计文本文件中的每个不同汉字、26个字母的个数
    并且排序出出现的最多的三个字符(汉字与字母一视同仁)

    下面的是其中的核心处理片段
    希望能帮助到你

    void C文本统计Dlg::OnBnClickedButton1()
    {
        // TODO: 在此添加控件通知处理程序代码
        int len, flag;
        int sum[9999];
        TCHAR ch[9999];
        CString chtmp;
        CString str;
        for (int i = 0; i<9999; i++)
            sum[i] = 0;
    
        GetDlgItemText(IDC_EDIT1, str);
        len = str.GetLength();
        flag = 0;
        if (len != 0) {
            //计数
            for (int i = 0; i < len; i++)
            {
                TCHAR unitemp = str.GetAt(i);     //TCHAR 可以保存双字节字符,如汉字
                if (!(_istpunct(unitemp)||_istspace(unitemp)||(unitemp == '\n')))  //判断是否为标点、特殊字符、空格、换行
                {
                    int f = 1;
                    for (int j = 0; j < flag; j++)
                        if (unitemp == ch[j])
                        {
                            sum[j]++;
                            f = 0;
                        }
                    if (f == 1)
                    {
                        ch[flag] = unitemp;
                        sum[flag] = 1;
                        flag++;
                    }
             }
            }
            //进行排序
            for (int i = 1; i<flag; i++)
                for (int j = 0; j<i; j++)
                    if (sum[j]<sum[i])
                    {
                        int t = sum[i]; sum[i] = sum[j]; sum[j] = t;
                        wchar_t c = ch[i]; ch[i] = ch[j]; ch[j] = c;
                    }
    
            CString str_tmp;
            chtmp.Insert(0, ch[0]);
            str_tmp.Format(_T("%s 出现了 %d 次"), chtmp, sum[0]);
            SetDlgItemText(IDC_EDIT2, str_tmp);
            chtmp.Empty();
            if (flag>1)
            {
                chtmp.Insert(0, ch[1]);
                str_tmp.Format(_T("%s 出现了 %d 次"), chtmp, sum[1]);
                SetDlgItemText(IDC_EDIT3, str_tmp);
                chtmp.Empty();
            }
            else
                {
                    str_tmp.Format(_T(" "));
                    SetDlgItemText(IDC_EDIT3, str_tmp);
                }
            if (flag > 2)
            {
                chtmp.Insert(0, ch[2]);
                str_tmp.Format(_T("%s 出现了 %d 次"), chtmp, sum[2]);
                SetDlgItemText(IDC_EDIT4, str_tmp);
                chtmp.Empty();
            }
            else
            {
                str_tmp.Format(_T(" "));
                SetDlgItemText(IDC_EDIT4, str_tmp);
            }
        }
        else
        {
            MessageBox(_T("请先输入文字或从文件导入。"));
        }
    
    }
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器