1

----閉じてください----

- - - 編集 - - - - -

問題がどこにあるかを見つけました。本当の問題について新しい質問を始めます…。

----------------------

 


やあ、

私の状況

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
4

3 に答える 3

1
  1. バリアントのwhile( !in )代わりに使用する方が良いです。この質問を参照してくださいeof

  2. 私はあなたがWindowsを使用していると仮定しています(LinuxとMacは通常ネイティブUTF-8プラットフォームエンコーディングを持っているので、これらのもののほとんどを無視することができます)。

私がすることは、ファイル全体をsとして読み取り、この質問の便利な関数を使用しcharて'sに変換することです:)。wchar_t

覚えておいてください:Linux(そしておそらくmac os xも)では、UTF-8ストリームを端末に出力して、適切な文字を取得できます。Windowsでは、これはまったく別の話です。

于 2010-08-14T14:52:01.570 に答える
0

残念ながら、C ++はここでは少し欠けています。wifstreamのwは、ワイド文字のファイルを処理する機能ではなく、使用中の型を指します。自分でコーディングを行う必要がありますが、レシピは次の場所にあります。

  1. C++ストリームでUTF-8を読み取る
  2. Unicodeを使用するためのSTLベースのアプリケーションのアップグレード
于 2010-08-14T14:45:22.267 に答える
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;
}
于 2010-08-14T14:58:02.470 に答える