2009-05-23 5 views
7

Tôi có một câu hỏi đơn giản để hỏi. Tôi có một tập tin văn bản UTF 16 để đọc bắt đầu với FFFE. Các công cụ C++ để xử lý loại tệp này là gì? Tôi chỉ muốn đọc nó, lọc một số dòng và hiển thị kết quả.Đọc các tập tin Unicode C++

Có vẻ đơn giản, nhưng tôi chỉ có kinh nghiệm làm việc với các tệp ascci đơn giản và tôi đang vội. Tôi đang sử dụng VS C++, nhưng tôi không muốn làm việc với quản lý C++.

Trân

Dưới đây là một đưa một ví dụ rất đơn giản

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

Trả lời

2

Bạn có thể sử dụng fgetws, mà đọc ký tự 16-bit. Tệp của bạn nằm trong thứ tự byte nhỏ. Vì các máy x86 cũng rất nhỏ nên bạn có thể xử lý tập tin mà không gặp nhiều rắc rối. Khi bạn muốn thực hiện đầu ra, hãy sử dụng fwprintf.

Ngoài ra, tôi đồng ý nhiều thông tin hơn có thể hữu ích. Ví dụ, bạn có thể đang sử dụng một thư viện tóm tắt một số điều này.

+0

Có, bạn đã nói tất cả, thông tin thêm có thể hữu ích. Tôi đã thử tại msdn, cuốn sách Jeffrey Richter, nhưng có vẻ như họ không có ví dụ hay khi nói về chủ đề này. Cảm ơn – Andres

0

Các FFFE chỉ là ban đầu BOM (thứ tự đánh dấu byte). Chỉ cần đọc từ các tập tin như bạn thường làm, nhưng vào một bộ đệm char rộng.

+0

mã ví dụ luôn luôn là một ý tưởng tốt - làm thế nào để bạn biết làm thế nào ông thường đọc một tập tin? –

+0

Trong khi tôi đồng ý với bạn Neil, Andres nói: "nhưng tôi chỉ có kinh nghiệm làm việc với các tệp ascci đơn giản." ;) – xian

1

Vì bạn đang vội vàng, hãy sử dụng ifstream ở chế độ nhị phân và thực hiện công việc của bạn. Tôi đã có cùng một vấn đề với bạn và điều này đã cứu ngày của tôi. (nó không phải là một giải pháp đề nghị, tất nhiên, nó chỉ là một 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 câu trả lời này thực sự đã giúp tôi. fgetws yêu cầu một bộ đệm có kích thước. –