C ++: File, codifiche e tipi di dati [chiusa]
Domanda
---- ---- Si prega di chiudere
------ Modifica ---------
Ho trovato dove il problema è. Ho intenzione di iniziare una nuova domanda per il vero problema ....
----------------------
Ciao,
Situazione :
Linux (Ubuntu 10.04)
gcc
Ma deve essere indipendente dalla piattaforma
Ho un file di testo (UTF-8) con i caratteri speciali come ¥ © ® Ỳ È Ð
. Ho un std::map
dove mi piacerebbe avere un tipo di dati per la chiave per tenere questi caratteri speciali. Attualmente sto usando wchar_t
.
Poi devo usare le stringhe, che può contenere questi caratteri. Ora sto utilizzando std::wstring
.
Devo leggere quel file UTF-8. Così, ho pensato con un wifstream
. E per linea di lavorazione, ho usato wstringstream
.
Credo che questo non è male, quello che ho fatto finora ... Se no, cosa è meglio?
Che cosa sta andando male :
Naturalmente, devo leggere quel file. Ma la lettura delle linee ferma alla prima linea con un carattere speciale. In breve questo è quello che ho fatto:
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);
}
Quindi, la domanda è: Come leggere un file con i caratteri speciali con un wifstream
Grazie in anticipo!
Come gli sguardi di file :
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
Soluzione
-
uso
while( !in )
invece della varianteeof
, è meglio, vedi questa domanda -
sto supponendo che si sta utilizzando Windows (come Linux e Mac hanno normalmente nativo codifica UTF-8 piattaforma, che consente di ignorare la maggior parte di questa roba).
Quello che vorrei fare è leggere l'intero file come char
s e convertirlo in wchar_t
di utilizzare le funzioni a portata di mano in questa domanda da me:).
Ricorda:. Su Linux (e probabilmente mac os x troppo) si può solo uscita un flusso UTF-8 ad un terminale e ottenere i personaggi giusti, in Windows, che è tutta una Kond diversa della storia
Altri suggerimenti
Purtroppo C ++ è un po 'carente qui - il w in wifstream si riferisce ai tipi in uso, piuttosto che la capacità di file maneggiare con caratteri estesi. Dovrete fare un po 'di codifica da soli, ma si possono trovare le ricette all'indirizzo:
Se non è necessario utilizzare i contenitori STL, vorrei suggerire utilizzando il framework Qt. Qt utilizza unicode dalla norma. Inoltre, le classi sono molto ben progettato e si sentono veramente buono da usare.
È possibile creare un QTextStream che farà le cose che si desidera .
Credo che il seguente codice dovrebbe fare.
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;
}