2010-08-14 69 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; 
}