100分,求助,C++读取unicode编码文件读取问题,解决着60分,顶着有份

李亚超 2011-04-15 01:54:33
读取unicode方法代码

std::vector<std::wstring>ReadAllLinesByUnicode(std::wstring filePath)
{
std::vector<std::wstring> list;
FILE *fp = NULL;
_wfopen_s(&fp,filePath.c_str() , L"rb,ccs=Unicode");
wchar_t buf[MAXLINESIZE+1] = {0}; // 假设每一行文本不超过2048字符
size_t rdCount = fread(buf, 1, 2, fp);
if (rdCount != 2)
{
fclose(fp);
return list;
}
if (buf[0] != 0xFF || buf[1] != 0xFE)
{
fseek(fp, 0, SEEK_SET); // 测试Unicode文件标志, 没有Unicode头,跳回文件头
}
while (!feof(fp))
{
if (NULL != fgetws(buf, MAXLINESIZE, fp))
{
list.push_back(buf);
}
}

fclose(fp);

return list;
}

调用代码:

wstring path=L"./data/input.txt";
wchar_t * str =L"中国";
vector<wstring> list = ReadAllLinesByUnicode(path);
for(int i=0;i<list.size();i++)
{
//int tmp = dic->InsertEntry(list[i].c_str());
if(wcscmp(list[i].c_str(), str)==0)
{
cout<<"OK\n";
}
}

input.txt 以Unicode编码:内容为:
中国
美国
日本
问题为:
1:ReadAllLinesByUnicode(path); 可以返回正确的文本行。
2:为什么不会出现结果“OK”?
3:
...全文
324 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 harry_lyc 的回复:]

我知道了,因为C++读取的每一行,是以\r\n为结束符的。所以,每一行都包含这两个字符。但是又不会显示,所以一直看不出来,包括调试。
如果,把测试字符加上\r\n或者是,每一行出去后两个字节,则正确显示。
看来,C++很麻烦啊,很多问题需要自己来操心。
[/Quote]
就是这样
遇到这种问题的时候,调试下,看看变量里放的是什么就知道了
yuyan_linger 2011-04-15
  • 打赏
  • 举报
回复

_wfopen_s(&fp,filePath.c_str() , L"r,ccs=Unicode"); //不用二进制读?
wchar_t buf[MAXLINESIZE+1] = {0}; // 假设每一行文本不超过2048字符
size_t rdCount = fread(buf, 1, 2, fp);
if (rdCount != 2)
{
fclose(fp);
return list;
}
if (buf[0] != 0xFF || buf[1] != 0xFE)
{
fseek(fp, 0, SEEK_SET); // 测试Unicode文件标志, 没有Unicode头,跳回文件头
}
fseek(fp, 2, SEEK_SET); //unicode好像会有个文件头
while (!feof(fp))
{
if (NULL != fgetws(buf, MAXLINESIZE, fp))
{
char* t = (char*)buf;
int len = strlen(t);
t[len-1]=0;
list.push_back(buf);
}
}

这样处理应该可以 应该有更好的方法吧? 文件读写和宽字符不熟 写的不太好
bluesky12312388 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 harry_lyc 的回复:]

我知道了,因为C++读取的每一行,是以\r\n为结束符的。所以,每一行都包含这两个字符。但是又不会显示,所以一直看不出来,包括调试。
如果,把测试字符加上\r\n或者是,每一行出去后两个字节,则正确显示。
看来,C++很麻烦啊,很多问题需要自己来操心。
[/Quote]
用C++就得习惯这样,呵呵。
李亚超 2011-04-15
  • 打赏
  • 举报
回复
我知道了,因为C++读取的每一行,是以\r\n为结束符的。所以,每一行都包含这两个字符。但是又不会显示,所以一直看不出来,包括调试。
如果,把测试字符加上\r\n或者是,每一行出去后两个字节,则正确显示。
看来,C++很麻烦啊,很多问题需要自己来操心。
bluesky12312388 2011-04-15
  • 打赏
  • 举报
回复
先打印看看(十六进制)。可能是每行后面有\r\n这类的,所以不相等。
走走刀口 2011-04-15
  • 打赏
  • 举报
回复
ReadAllLinesByUnicode(path)可以返回行数那是肯定的.应该它是根据\r\n来判断的,与unicode字符无关.
而后面要对字符进行查找就出现问题了,估计读出来的是乱码,你先把list中的内容输出出来看下.
pathuang68 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pathuang68 的回复:]

我觉得这句话有问题:
vector<wstring> list = ReadAllLinesByUnicode(path);

ReadAllLinesByUnicode的函数原型是啥?
[/Quote]
sorry,请无视
pathuang68 2011-04-15
  • 打赏
  • 举报
回复
我觉得这句话有问题:
vector<wstring> list = ReadAllLinesByUnicode(path);

ReadAllLinesByUnicode的函数原型是啥?
bargio_susie 2011-04-15
  • 打赏
  • 举报
回复
if(wcscmp(list[i].c_str(), str)==0)
这个之前把list里的内容打印出来看下是什么

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧