C ++:文件,编码和数据类型

时间:2010-08-14 14:34:45

标签: c++ encoding file-io wchar-t

----请关闭----

------编辑---------

我发现了问题所在。我将为真正的问题开始一个新的问题......

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


您好,

我的情况

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

3 个答案:

答案 0 :(得分:1)

  1. 使用while( !in )代替eof变种,最好是this question

  2. 我假设您正在使用Windows(因为Linux和Mac通常具有原生的UTF-8平台编码,这使您可以忽略大部分内容)。

  3. 我要做的是将整个文件作为char读取,然后使用this question中的便捷函数将其转换为wchar_t。)。

    请记住:在linux上(也可能是mac os x)你可以输出一个UTF-8流到终端,并在Windows中获得正确的角色,这是一个完全不同的故事。

答案 1 :(得分:0)

不幸的是C ++在这里有点缺乏 - wifstream中的w指的是使用的类型,而不是处理宽字符文件的能力。你必须自己做一些编码,但你可以在以下网址找到食谱:

  1. Reading UTF-8 with C++ streams
  2. Upgrading an STL-based application to use Unicode

答案 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;
}