gpt4 book ai didi

c++ - 使用 wregex 会产生垃圾输出?

转载 作者:行者123 更新时间:2023-11-30 04:16:28 25 4
gpt4 key购买 nike

我创建了一个使用正则表达式来标记文件的简单程序。对于非 Unicode 内容,它工作正常。对于基于 Unicode 的内容,我制作了一个 wregex 版本,但这个版本会产生垃圾输出!

我试图在控制台屏幕上输出 Unicode 字符或字符串,而不是将它们存储在 map<wstring,int> 中和一个 wostream 类型的文件,以便值是完整和正确的。运行应用程序后,包含提取 token 的文件只包含垃圾!!!

这个程序有什么问题,我该如何解决?

#include "stdafx.h"

#include <iostream>
#include <regex>
#include <fstream>
#include <string>
#include <map>
using namespace std;

int main()
{
string path="";

map<wstring, int> container;
wifstream file("ftest.txt");
wregex reg(_T("\\w+"));
wstring s=_T("");
while (file.good())
{
file>>s;
for ( wsregex_iterator it (s.begin(), s.end(), reg),it_end; it != it_end; ++it)
{
container[(wstring)(*it)[0]]++ ;
}

}

cout <<"\nDone..."<< endl;
wofstream output("list.txt",ios::app);
for (auto item : container)
{
//cout<<item.first<<" : "<<item.second<<endl;
output<<item.first<<" : "<<item.second<<endl;
}
system("pause");
return 0;
}

这是ftest.txt的内容:

بسم الله الرحمن الرحیم 
واشنگتن پست طی گزارشی اعلام کرد کنگره آمریکا برخلاف رویه سابق، ارسال مصوبه سالانه خود در زمینه تحریم های ایران به کاخ سفید را به تاخیر انداخت و به نظر می رسد انتخاب حسن روحانی به عنوان رئیس جمهوری جدید ایران علت این امر بوده است.
0 0 0 نظر
[-] اندازه متن [+]


به دنبال انتخاب حسن روحانی به عنوان رئیس جمهوری جدید ایران، کنگره آمریکا بر اساس برخی ملاحظات ارسال مصوبه سالانه خود در زمینه تحریم های ایران به کاخ سفید را به تاخیر انداخت.

这是list.txt里面的垃圾输出

0 : 3
1 : 1
14 : 1
16 : 1
26 : 1
27 : 1
5 : 2
50 : 1
6 : 1
7 : 1
ط : 475
طھ : 12
طھط : 20
طھطµظ : 1
طھظ : 10
طھغ : 2
ط² : 6
ط²ط : 6
ط²ظ : 6
ط³ : 5
ط³ط : 12
ط³طھ : 8
ط³طھط : 4
ط³طھظ : 2
ط³ظ : 10
ط³غ : 1
طµ : 1
طµط : 1
طµظ : 6
ط¹ط : 1
ط¹ظ : 8
ظ : 291
ع : 54
غ : 95
ï : 1

最佳答案

这个 link 解决了我的问题。:) 要获得可移植的解决方案,请检查这个 link

这是完美运行的最终代码 :) :

#include "stdafx.h"
#include <iostream>
#include <regex>
#include <fstream>
#include <string>
#include <map>
#include <fcntl.h> // for _wfopen_s
#include <io.h> //for _setmode


using namespace std;

int main()
{
string path = "";

map<wstring, int> container;

FILE* fp;
_wfopen_s (&fp, L"ftest.txt", L"r");
_setmode (_fileno (fp), _O_U8TEXT);

wifstream file(fp);
wregex reg(L"\\w+");

wstring s = L"";

while (file.good())
{
getline(file,s);
for ( wsregex_iterator it (s.begin(), s.end(), reg), it_end ; it != it_end ; ++it)
{
container[(wstring)(*it)[0]]++ ;
}
}

cout <<"\nDone..."<< endl;

fclose(fp);

_wfopen_s (&fp, L"list.txt", L"w");
_setmode (_fileno (fp), _O_U8TEXT);
wofstream output(fp);

for (auto item : container)
{
wcout<<item.first <<" : "<<item.second <<endl;
//write output to list.txt
output<<item.first <<" : "<<item.second <<endl;
}
fclose(fp);
system("pause");
return 0;
}

关于c++ - 使用 wregex 会产生垃圾输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17770000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com