Tôi đã cố gắng đọc trên iostream và hiểu chúng tốt hơn. Thỉnh thoảng tôi thấy nó nhấn mạnh rằng bộ chèn (<<
) và máy nhổ (>>
) có nghĩa là để được sử dụng trong văn bản serialization. Đó là một vài nơi, nhưng bài viết này là một ví dụ điển hình:Chèn và trích xuất đọc/ghi dữ liệu nhị phân so với văn bản
http://spec.winprog.org/streams/
Bên ngoài của vũ trụ <iostream>
, có những trường hợp các < < và >> được sử dụng theo cách dòng giống như chưa làm không tuân theo bất kỳ quy ước văn bản nào. Ví dụ, họ ghi dữ liệu được mã hóa nhị phân khi được sử dụng bởi QDataStream
Qt của:
http://doc.qt.nokia.com/latest/qdatastream.html#details
Ở cấp độ ngôn ngữ, < < và >> nhà khai thác thuộc về dự án của bạn để quá tải (vì thế những gì QDataStream không rõ ràng là có thể chấp nhận) . Câu hỏi của tôi là liệu nó có được coi là thực hành không tốt cho những người sử dụng <iostream>
để sử dụng các toán tử < < và >> để triển khai mã hóa và giải mã nhị phân. Có (ví dụ) bất kỳ kỳ vọng nào nếu được ghi vào một tệp trên đĩa có thể xem và chỉnh sửa tệp bằng trình chỉnh sửa văn bản không?
Có nên luôn sử dụng tên phương pháp khác và đặt chúng trên read()
và write()
? Hoặc nên mã hóa văn bản được coi là chỉ là một hành vi mặc định mà các lớp tích hợp với iostream thư viện chuẩn có thể chọn bỏ qua?
CẬP NHẬT Một vấn đề thuật ngữ quan trọng về vấn đề này có vẻ là sự khác biệt của I/O được "định dạng" vs "chưa định dạng" (như trái ngược với khái niệm "văn bản" vs "nhị phân"). Tôi tìm thấy câu hỏi này:
writing binary data (std::string) to an std::ofstream?
Nó có một bình luận từ @ TomalakGeret'kal nói "Tôi không muốn sử dụng < < cho dữ liệu nhị phân anyway, như bộ não của tôi đọc nó như là 'định dạng đầu ra' đó không phải là những gì bạn đang làm. Một lần nữa, nó hoàn toàn hợp lệ, nhưng tôi sẽ không nhầm lẫn bộ não của tôi như thế. "
Câu trả lời được chấp nhận cho câu hỏi nói rằng điều đó là tốt miễn là bạn sử dụng ios::binary
. Điều đó dường như củng cố "không có gì sai trái với nó" của cuộc tranh luận ... nhưng tôi vẫn không thấy bất kỳ nguồn có thẩm quyền nào về vấn đề này.
"Mã hóa văn bản" là thuật ngữ gây hiểu lầm. "Định dạng I/O" là phù hợp hơn, tôi sẽ nói. –
Làm bất cứ điều gì khuôn khổ của bạn làm. –
@KerrekSB Tôi có ý nghĩa rõ ràng hơn về quy tắc "Mã hóa văn bản" ngoài quy tắc "Định dạng I/O". Nếu tôi có một đối tượng với N số nguyên 32 bit trong nó, sau đó sử dụng 'write()' để xuất 4 byte cho N theo sau là 4 * N byte tương ứng với các giá trị ... vẫn còn "định dạng"? – HostileFork