----请关闭----
我发现了问题所在。我将为真正的问题开始一个新的问题......
您好,
我的情况:
Linux (Ubuntu 10.04)
gcc
但它必须是独立于平台的
我有一个包含¥ © ® Ỳ È Ð
等特殊字符的文本文件(UTF-8)。我有一个std::map
我希望有一个数据类型的密钥来保存这些特殊字符。目前我正在使用wchar_t
。
然后我必须使用可以包含这些字符的字符串。现在我正在使用std::wstring
。
我必须阅读UTF-8文件。所以,我想使用wifstream
。对于行处理,我使用了wstringstream
。
我认为这还不错,到目前为止我做了什么......如果没有,有什么更好的?
出了什么问题:
当然,我必须阅读该文件。但读取行会在第一行停止,并带有特殊字符。简而言之,这就是我所做的:
map<wchar_t, Glyph*> glyphs;
//...
wifstream in(txtFile.c_str());
if (!in.is_open())
{
throw runtime_error("Cannot open font text file!!");
}
wstring line;
while (getline(in, line)) // edit
{
printf("Loading glyph\n");
if (line.length() == 0)
{
continue;
}
wchar_t keyChar = line.at(0);
/* First, put the four floats into the wstringstream */
wstringstream ss(line.substr(2));
/* Now, read them out */
Glyph *g = new Glyph();
ss >> g->x;
ss >> g->y;
ss >> g->w;
ss >> g->h;
glyphs[keyChar] = g;
printf("Glyph `%c` (%d): %f, %f, %f, %f\n", keyChar, keyChar, g->x, g->y, g->w, g->h);
}
所以,问题是:如何使用带有wifstream的特殊字符读取文件?
提前致谢!
文件的外观:
0.000000 0.000000 0.010909 0.200000
A 0.023636 0.000000 0.014545 0.200000
B 0.050909 0.000000 0.014545 0.200000
C 0.078182 0.000000 0.014545 0.200000
D 0.105455 0.000000 0.014545 0.200000
E 0.132727 0.000000 0.014545 0.200000
...
È 0.661818 0.400000 0.014545 0.200000
É 0.689091 0.400000 0.014545 0.200000
Ê 0.716364 0.400000 0.014545 0.200000
Ë 0.743636 0.400000 0.014545 0.200000
Ì 0.770909 0.400000 0.012727 0.200000
Í 0.796364 0.400000 0.012727 0.200000
Î 0.821818 0.400000 0.012727 0.200000
Ï 0.847273 0.400000 0.012727 0.200000
Ð 0.872727 0.400000 0.014545 0.200000
Ñ 0.900000 0.400000 0.014545 0.200000
答案 0 :(得分:1)
使用while( !in )
代替eof
变种,最好是this question
我假设您正在使用Windows(因为Linux和Mac通常具有原生的UTF-8平台编码,这使您可以忽略大部分内容)。
我要做的是将整个文件作为char
读取,然后使用this question中的便捷函数将其转换为wchar_t
。)。
请记住:在linux上(也可能是mac os x)你可以输出一个UTF-8流到终端,并在Windows中获得正确的角色,这是一个完全不同的故事。
答案 1 :(得分:0)
不幸的是C ++在这里有点缺乏 - wifstream中的w指的是使用的类型,而不是处理宽字符文件的能力。你必须自己做一些编码,但你可以在以下网址找到食谱:
答案 2 :(得分:0)
如果您不必使用STL容器,我建议使用Qt框架。 Qt标准使用unicode。此外,这些课程设计得非常好,使用起来非常好。
您可以创建QTextStream来完成您想要的任务。
我认为以下代码应该这样做。
QHash<QChar, Glyph*> glyph_map;
QFile data("input.txt");
if (!data.open(QFile::ReadOnly) {
// handle error and return...
}
QTextStream in(&data);
while (!in.atEnd()) {
QChar c;
in >> c;
// do stuff with your Glyph
glyph_map[c] = glyph;
}