2012-06-06 27 views
5

Phần nào của luồng C++ IO thực hiện chuyển đổi \r sang \r\n? Có phải chính nó là stream_buf hoặc là một phần của chuyển đổi mã hóa bên trong thành mã hóa bên ngoài theo khía cạnh codecvt?luồng, stream_bufs, codecvt khía cạnh và n tới r n dịch

UPDATE 1

Tất cả các bạn nói rằng nó được thực hiện trong streambuf/filebuf. Được. Nhưng cách sắp xếp này xử lý như thế nào, ví dụ, mã hóa bên ngoài như UTF-16? Sau đó, có vẻ như các tập tin đã được mở ra với cờ ios::binary mà vô hiệu hóa bản dịch.

+1

Không nên là '\ n' để chuyển đổi' \ r \ n'? Thông thường, những gì bạn sẽ nhận được từ mã di động là '\ n' và bạn cần phải thêm trước dòng nguồn cho các biểu diễn" cửa sổ như ". –

+0

Để thêm phần bổ sung '\ r' không liên quan đến mã hóa ký tự đã sử dụng, nó vẫn là ký tự phụ. '\ R' điều khiển con trỏ ghi đầu cuối để bắt đầu tại cột 0 cho một số đầu cuối. 'codecvt' kiểm soát số byte được sử dụng để mã hóa một ký tự đơn. –

Trả lời

2

Chuyển đổi này không phải (thường) được thực hiện bởi luồng, streambuf hoặc facet. Đó là trách nhiệm đối với mã thư viện C (ví dụ: fputc()) được gọi bởi overflow()underflow() của streambuf.

Nếu bạn cần nó cho một lý do nào (ví dụ như khi thực hiện một thói quen dos2unix), có một ví dụ tiện dụng trong boost.iostreams.

EDIT: std::filebuf chỉ hỗ trợ mã hóa nhiều byte cho các tập tin văn bản, ví dụ như UTF-8 hoặc GB18030 hoặc bất cứ locale sử dụng. Một tệp UTF-16 sẽ phải được mở ở chế độ nhị phân, dưới dạng luồng byte đơn thuần (có thể được hiểu là UTF-16 với các cơ sở codecvt của C++ 11) và có kết thúc dòng sẽ không được chuyển đổi.

+0

việc triển khai streambuf không nhất thiết phải sử dụng fputc(), điều này phụ thuộc vào ngữ cảnh. Chúng tôi đã triển khai cho streambuf trực tiếp xuất ra một UART cho mục đích gỡ lỗi, hệ điều hành (RT) được sử dụng thậm chí không cung cấp xử lý tập tin, vì vậy làm thế nào để sử dụng fputc() sau đó ?? –

+0

@ g-makulik Các streambuf được sử dụng bởi 'std :: cout' nói riêng là cần thiết để sử dụng cùng một bộ đệm cơ bản như những gì C I/O sử dụng khi viết để' stdout', do đó, điều này sẽ không chuẩn. Đối với filebuf và các streambuf khác, tốt, đó là những gì "thường" của tôi là dành cho. – Cubbi

1

IFAIR nó được thực hiện trong quá trình triển khai streambuf, codecvt chỉ đề cập đến các chi tiết đại diện của ngôn ngữ.

+0

Nhận xét giống như câu trả lời của Éric Malenfant: Tại sao nó lại được thực hiện trong filebuf? Điều đó không có nghĩa là filebuf phải có một số kiến ​​thức về mã hóa bên ngoài được cung cấp bởi khía cạnh codecvt? – wilx

+0

Nó không có gì để làm với mã hóa ký tự IMHO, nhưng làm thế nào hệ điều hành xử lý kết thúc dòng trong màn hình thiết bị đầu cuối. –

1

Nó được thực hiện bởi std :: filebuf, nếu nó được mở mà không có cờ nhị phân ios ::.

+0

Tại sao nó được thực hiện trong 'filebuf'? Điều đó không có nghĩa là 'filebuf' phải có một số kiến ​​thức về mã hóa bên ngoài được cung cấp bởi khía cạnh' codecvt'? – wilx

Các vấn đề liên quan