Tôi có mã điều khiển các tệp nhị phân bằng cách sử dụng fstream với cờ nhị phân được đặt và sử dụng các hàm I/O chưa được định dạng đọc và ghi. Điều này hoạt động chính xác trên tất cả các hệ thống mà tôi từng sử dụng (các bit trong tệp chính xác như mong đợi), nhưng về cơ bản tất cả đều là tiếng Anh của Hoa Kỳ. Tôi đã tự hỏi về tiềm năng cho các byte được sửa đổi bởi một codecvt trên một hệ thống khác nhau.Viết các tệp nhị phân bằng C++: có phải vấn đề địa phương mặc định không?
Có vẻ như tiêu chuẩn cho biết sử dụng I/O chưa được định dạng hoạt động giống như đặt ký tự vào streambuf bằng sputc/sgetc. Điều này sẽ dẫn đến các chức năng tràn hoặc tràn trong streambuf nhận được gọi, và nó âm thanh như những dẫn đến công cụ đi qua một số codecvt (ví dụ, xem 27.8.1.4.3 trong tiêu chuẩn C++). Đối với basic_filebuf việc tạo codecvt này được xác định trong 27.8.1.1.5. Điều này làm cho nó trông giống như kết quả sẽ phụ thuộc vào những gì basic_filebuf.getloc() trả về. Vì vậy, câu hỏi của tôi là, tôi có thể giả định rằng một mảng ký tự được viết bằng cách sử dụng of.write trên một hệ thống có thể được phục hồi nguyên văn bằng cách sử dụng ifstream.read trên một hệ thống khác, không có vấn đề gì cấu hình địa phương hoặc người có thể được sử dụng trên của họ hệ thống? Tôi sẽ làm cho các giả định sau:
- Chương trình được sử dụng mặc định locale (ví dụ: chương trình là không thay đổi các thiết lập miền địa phương tự ở tất cả).
- Cả hai hệ thống đều có CHAR_BIT 8, có cùng thứ tự bit trong mỗi byte, lưu trữ tệp dưới dạng octet, v.v.
- Đối tượng luồng có cờ nhị phân được đặt.
- Chúng tôi không cần phải lo lắng về bất kỳ sự khác biệt về cuối cùng nào ở giai đoạn này. Nếu bất kỳ byte nào trong mảng được hiểu là giá trị nhiều byte, thì các chuyển đổi cuối cùng sẽ được xử lý theo yêu cầu ở giai đoạn sau.
Nếu ngôn ngữ mặc định không được đảm bảo truyền tải nội dung này chưa được sửa đổi trên một số cấu hình hệ thống (Tôi không biết, tiếng Ả Rập hoặc gì đó), cách tốt nhất để viết tệp nhị phân bằng C++ là gì?
Tôi nghĩ bạn nên thêm cùng thứ tự byte vào giả định của mình. Hay tôi hoàn toàn ở ngoài đó? –
@TheScottMachine: Space_C0wb0y là đúng, thêm cùng thứ tự byte vào các giả định của bạn – Stan
Cảm ơn, tôi đã thêm một giả định bổ sung để làm rõ. – TheScottMachine