質問

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

- - - 編集 - - - - -

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

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

 


やあ、

私の状況:

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
役に立ちましたか?

解決

  1. 使用する while( !in ) の代わりに eof バリアント、それはより良いですね この質問

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

私がすることは、ファイル全体を次のように読むことです charsとそれを変換します wchar_t便利な機能を使用しています この質問 私によって:)。

覚えておいてください:Linux(およびおそらくMac OS Xも)では、UTF-8ストリームをターミナルに出力し、Windowsで適切な文字を取得できます。これはまったく異なるストーリーです。

他のヒント

残念ながら、C ++はここに少し欠けています-WifstreamのWは、幅の広い文字を持つファイルを処理する機能ではなく、使用されているタイプを指します。自分でコーディングを行う必要がありますが、次のレシピを見つけることができます。

  1. C ++ストリームでUTF-8を読み取ります
  2. STLベースのアプリケーションをアップグレードしてUnicodeを使用します

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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top