2009-05-23 20 views
7

Mam proste pytanie. Mam plik tekstowy UTF 16 do odczytu, który zaczyna się od FFFE. Jakie są narzędzia C++ do radzenia sobie z tego rodzaju plików? Chcę go tylko przeczytać, przefiltrować niektóre linie i wyświetlić wynik.Czytaj pliki w formacie Unicode C++

Wygląda to prosto, ale mam po prostu doświadczenie w pracy z prostymi plikami ascci i jestem w pośpiechu. Używam VS C++, ale nie chcę pracować z zarządzanym C++.

Pozdrowienia

Tutaj put bardzo prosty przykład

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(); 

Odpowiedz

2

Można użyć fgetws, który odczytuje 16-bitowych znaków. Twój plik jest w małej, endianowej kolejności bajtów. Ponieważ maszyny x86 są również little-endianami, powinieneś być w stanie obsłużyć plik bez większych problemów. Jeśli chcesz uzyskać wyjście, użyj fwprintf.

Ponadto, zgadzam się, że więcej informacji może być przydatne. Na przykład możesz korzystać z biblioteki, która usuwa niektóre z nich.

+0

Tak, powiedziałeś wszystko, więcej informacji może być użytecznych. Próbowałem w książce msdn, Jeffrey Richter, ale wygląda na to, że nie mają dobrych przykładów mówiąc o tym temacie. Dzięki – Andres

0

fffe to dopiero początkowy BOM (bajt znaku zamówienie). Po prostu czytaj z pliku tak, jak zwykle, ale do szerokiego bufora znaków.

+0

przykład kodu jest zawsze dobry pomysł - skąd wiesz, jak on normalnie odczytuje plik? –

+0

Chociaż zgadzam się z tobą, Neil, Andres mówi: "ale mam doświadczenie w pracy z prostymi plikami ascci." ;) – xian

1

Ponieważ jesteś w pośpiechu, użyj ifstream w trybie binarnym i wykonuj swoją pracę. Miałem takie same problemy z Tobą i to uratowało mój dzień. (nie jest to rekomendowane rozwiązanie, oczywiście, jego po prostu 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 ta odpowiedź naprawdę mi pomogła. fgetws wymaga bufora o rozmiarze. –