tôi sao chép câu trả lời của tôi từ
fopen or CreateFile in Windows
mà đã được đóng cửa vì lý do đó thoát khỏi tôi ...
- Không có cách nào định nghĩa cho fopen() để trả lại lỗi hệ thống mã.Có thể có một cách không xác định để truy cập errno, nhưng điều này có thể hoặc có thể không giống với mã lỗi hệ thống.
- Ngoài ra, tôi không nghĩ rằng có một cách xác định để truy cập vào xử lý hệ thống thực (loại HANDLE) mà lần lượt bạn có thể muốn sử dụng để chuyển sang một trong nhiều cuộc gọi hệ thống win64 mà mong đợi như vậy hệ thống xử lý (ví dụ như bộ nhớ ánh xạ IO)
- Sử dụng open() một số nguyên đại diện cho xử lý tệp, không phải là xử lý hệ thống (trên cửa sổ).
- fopen() không ném ngoại lệ trong trường hợp xảy ra lỗi. Để có một số RAII bạn sẽ cần phải quấn nó vào một lớp học.
- Đưa gói CreateFile() vào một lớp, không đắt hơn gói fopen() hoặc mở() vào một lớp.
- Sử dụng C++ tính năng (std :: ofstream, std :: ifstream) để viết/đọc đến/từ các tập tin bị cùng một vấn đề như fopen():
- Nó không ném theo mặc định trên lỗi. Để kích hoạt tính năng này, bạn cần gọi một số phương thức thay vì có thể sử dụng một số đối số hàm tạo - có nghĩa là đối với RAII, bạn sẽ cần phải lấy ra lớp này (để sử dụng nó như một lớp thành viên/cơ sở phát sinh lỗi) .
- Không xác định được nếu có thể truy xuất mã lỗi hệ thống từ trường hợp ngoại lệ được ném hoặc nếu thư được trả về từ cái gì() cho bạn biết bất kỳ điều gì về lỗi hệ thống.
- Sử dụng giao diện luồng này không có giao diện pluggable thực để xác định nguồn hoặc đích đọc hoặc ghi. Quá tải giao diện luồng khá cồng kềnh và dễ bị lỗi.
- Sử dụng C như lập trình (chú ý đến hoặc bỏ qua mã trở lại và tự viết mã ngẫu nhiên) là nguồn gốc của nhiều ác (nhớ trái tim chảy máu?) ...
Kết luận:
- viết trình bao bọc tài nguyên cho CreateFile()/CloseHandle(). Tài nguyên wrapper là một lớp, mà thực hiện các hành động trong constructor và undo-hành động trong destructor và ném một ngoại lệ trong trường hợp lỗi. Có rất nhiều cặp cuộc gọi hệ thống như vậy trong mọi hệ điều hành nhưng đặc biệt là trong Win64.
- Viết một lớp ngoại lệ lỗi hệ thống (được sử dụng cho lớp trên trong trường hợp CreateFile() không thành công và cho tất cả các lỗi hệ thống khác) hoặc điều tra, lớp system_exception mới (trong C++ 0x) thực sự đang làm gì và nếu nó là đủ.
- viết một wrapper chức năng cho ReadFile() và WriteFile() mà chuyển đổi một lỗi hệ thống vào một đối tượng hệ thống ném ngoại lệ ...
- có khả năng xác định giao diện của riêng bạn để ghi vào đâu đó và đọc từ một nơi nào đó mà bạn có thể thực hiện những thứ khác độc lập với loại nguồn/đích để đọc từ/ghi tới.
- Viết một lớp bộ nhớ cache cho phép bạn đọc bộ nhớ cache từ đâu đó hoặc viết ở đâu đó cũng là trò chơi trẻ em. Tất nhiên lớp bộ nhớ cache không nên biết và cũng không quan tâm đến nguồn/đích mà bạn đang viết/đọc từ đó.
Đừng lo lắng về những tác vụ nhỏ này. Bạn sẽ thực sự biết, những gì đang xảy ra trong mã của bạn và những đoạn mã nhỏ này sẽ không đáng kể (trong số lượng dòng mã) so với mã gọi nó. Ngoài ra nếu bạn đang sử dụng RAII cho tất cả mọi thứ, mã gọi vào các lớp tiện ích này sẽ ít hơn đáng kể so với khi không sử dụng RAII và phải sử dụng hai hoặc thậm chí nhiều bước khởi tạo hơn và ít xảy ra lỗi hơn đáng kể.Thay thế các lớp tiện ích này với các lớp tiện ích tương đương cho hệ điều hành khác cũng là cách chơi con (sử dụng mở()/close()/read()/write() trên UNIX).
Và vì lợi ích của thiên niên kỷ trước không đọc nguyên tắc lập trình của Google!
Nguồn
2015-08-03 18:34:59
Tôi muốn điện :) viết và đọc nhị phân. chỉ cho windows systems.As tôi nghe mở và fopen không phù hợp với createfile? điều này đúng không? – Eveler
@Eveler: nếu bạn muốn toàn bộ sức mạnh, thì điều nhanh nhất bạn có thể làm để xử lý một tệp là mở nó bằng 'CreateFile' và ánh xạ nó vào bộ nhớ bằng' CreateFileMapping', như được minh họa trong [bài đăng trên blog] này (http: //blogs.msdn.com/b/oldnewthing/archive/2005/05/13/417183.aspx), là một phần của chuỗi tối ưu hóa bắt đầu từ [standard C++] (http://blogs.msdn.com/ b/oldnewthing/archive/2005/05/10/415991.aspx) và sau đó chuyển dần sang [Win32 tối ưu hóa mã] (http://blogs.msdn.com/b/oldnewthing/archive/2005/05/19/420038 .aspx). Nhưng trong hầu hết trường hợp, tiêu chuẩn đơn giản C và C++ là OK. –
'fopen' là hàm mức cao hơn, được thay thế bằng' fstream :: open' trong C++. 'CreateFile' và' open' là các hàm mức hệ thống, hàm đầu tiên trong Windows, thứ hai trong Unix. Họ không cung cấp chính xác điều tương tự, vì các hệ thống hỗ trợ các tính năng khác nhau một cách khác nhau. –