2009-05-23 16 views
7

Ho una semplice domanda da porre. Ho un file di testo UTF 16 da leggere che inizia con FFFE. Quali sono gli strumenti C++ per gestire questo tipo di file? Voglio solo leggerlo, filtrare alcune linee e visualizzare il risultato.Leggere i file Unicode C++

Sembra semplice, ma ho solo esperienza nel lavoro con file ASCC semplici e sono di fretta. Sto usando VS C++, ma non voglio lavorare con C++ gestito.

saluti

Ecco una put un esempio molto semplice

wifstream file; 
file.open("C:\\appLog.txt", ios::in); 

wchar_t buffer[2048]; 
file.seekg(2); 
file.getline(buffer, bSize-1); 

wprintf(L"%s\n", buffer); 
file.close(); 

risposta

2

È possibile utilizzare fgetws, che legge i caratteri a 16 bit. Il tuo file è in little-endian, in ordine di byte. Poiché le macchine x86 sono anche little-endian, dovresti essere in grado di gestire il file senza troppi problemi. Quando si desidera eseguire l'output, utilizzare fwprintf.

Inoltre, sono d'accordo che più informazioni potrebbero essere utili. Ad esempio, potresti utilizzare una libreria che astrae parte di ciò.

+0

Sì, hai detto tutto, più informazioni potrebbero essere utili. Ho provato a msdn, il libro di Jeffrey Richter, ma sembra che non abbiano buoni esempi quando si parla di questo argomento. Grazie – Andres

0

Il FFFE è solo il BOM (contrassegno ordine byte) iniziale. Basta leggere dal file come si fa normalmente, ma in un ampio buffer di caratteri.

+0

codice di esempio è sempre una buona idea - come fai a sapere come ha normalmente legge un file? –

+0

Mentre sono d'accordo con te, Neil, Andres dice: "ma ho solo esperienza nel lavoro con file ASCC semplici". ;) – xian

1

Dato che siete di fretta, utilizzate ifstream in modalità binaria e fate il vostro lavoro. Ho avuto gli stessi problemi con te e questo mi ha salvato la giornata. (non è una soluzione consigliata, naturalmente, il suo solo un hack)

ifstream file; 
    file.open("k:/test.txt", ifstream::in|ifstream::binary); 

    wchar_t buffer[2048]; 
    file.seekg(2); 
    file.read((char*)buffer, line_length); 
    wprintf(L"%s\n", buffer); 
    file.close(); 
+0

Nick questa risposta mi ha davvero aiutato. fgetws richiede un buffer di dimensioni. –