----請關閉----C++:文件,編碼和數據類型
------編輯---------
我發現了問題的所在。我要開始爲實際問題的新問題....
----------------------
嗨,
我的情況:
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
@Martijn:你應該使用'std :: string'處理並獲得UTF-8字符串。 'wchar_t'不方便,也不是跨平臺的。您可以使用空格作爲分隔符,並將UTF-8字符(1-4個字節寬)存儲在'std :: string'中,或者如果您確實需要'char *',則可以使用該空格作爲分隔符。 'std :: wifstream'用於讀取'wchar_t's(這種類型轉換爲Linux上的UTF-32和Windows上的UTF-16),而不是UTF-8 – rubenvb 2010-08-14 15:06:28