2010-08-14 68 views
1

----请关闭----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 

回答

1
  1. 使用while(!in),它的好,请参阅this question

  2. 我假设您使用的是Windows(正如Linux和Mac平时一样采用原生的UTF-8平台编码,可以让你忽略大部分这些东西)。

我会做的是读取整个文件作为char S和它使用便捷的功能由我转换成wchar_t的在this question :)。你可以在终端上输出一个UTF-8流,并在Windows中获得正确的字符,这是一个完全不同的故事。

+0

@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

0

如果你不必使用STL容器,我会建议使用Qt框架。 Qt使用标准的Unicode。而且,这些课程设计得非常好,使用起来真的很棒。

你可以创建一个QTextStream来完成你想要的事情。

http://doc.trolltech.com/latest/qtextstream.htm

我认为下面的代码应该做的。

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