C ++:ファイル、エンコーディング、データ型[閉じた
質問
----閉じてください----
- - - 編集 - - - - -
私は問題がどこにあるかを見つけました。本当の問題について新しい質問を始めます。
----------------------
やあ、
私の状況:
Linux (Ubuntu 10.04)
gcc
しかし、それはプラットフォームに依存する必要があります
私はような特殊文字を持つテキストファイル(UTF-8)を持っています ¥ © ® Ỳ È Ð
. 。私は持っています std::map
これらの特殊文字を保持するためのキーのデータ型を持ちたい場所。現在、私は使用しています wchar_t
.
次に、これらのチャーを含むことができる文字列を使用する必要があります。今私は使用しています std::wstring
.
そのUTF-8ファイルを読む必要があります。だから、私はaを使うと思った 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
解決
使用する
while( !in )
の代わりにeof
バリアント、それはより良いですね この質問私はあなたがWindowsを使用していると仮定しています(LinuxとMacには通常、ネイティブUTF-8プラットフォームエンコードがあります。これにより、このようなもののほとんどを無視できます)。
私がすることは、ファイル全体を次のように読むことです char
sとそれを変換します wchar_t
便利な機能を使用しています この質問 私によって:)。
覚えておいてください:Linux(およびおそらくMac OS Xも)では、UTF-8ストリームをターミナルに出力し、Windowsで適切な文字を取得できます。これはまったく異なるストーリーです。
他のヒント
残念ながら、C ++はここに少し欠けています-WifstreamのWは、幅の広い文字を持つファイルを処理する機能ではなく、使用されているタイプを指します。自分でコーディングを行う必要がありますが、次のレシピを見つけることができます。
STLコンテナを使用する必要がない場合は、QTフレームワークを使用することをお勧めします。 QTは標準ごとにUnicodeを使用します。また、クラスは非常にうまく設計されており、使用するのが本当に良いと感じています。
aを作成できます 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;
}