c++如何读取文本文件中的汉字,通过wifstream和locale
我之前写了一个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("请先输入文字或从文件导入。"));
}
}