Đầu tiên, không có lý do đặc biệt tốt để sử dụng fdopen
nếu fopen
là một tùy chọn và open
là lựa chọn khả thi khác. Bạn không nên sử dụng open
để mở tệp ở vị trí đầu tiên nếu bạn muốn a FILE *
. Vì vậy, bao gồm fdopen
trong danh sách đó là không chính xác và khó hiểu bởi vì nó không giống như những người khác. Bây giờ tôi sẽ tiến hành bỏ qua nó vì sự khác biệt quan trọng ở đây là giữa một tiêu chuẩn C FILE *
và một mô tả tệp dành riêng cho hệ điều hành.
Có bốn lý do chính để sử dụng fopen
thay vì open
.
fopen
cung cấp cho bạn bộ đệm IO có thể nhanh hơn rất nhiều so với những gì bạn đang làm open
.
fopen
thực hiện dịch kết thúc dòng nếu tệp không được mở ở chế độ nhị phân, điều này có thể rất hữu ích nếu chương trình của bạn được chuyển sang môi trường không phải là Unix (mặc dù thế giới dường như chỉ hội tụ trên mạng thôi (trừ mạng dựa trên văn bản IETF các giao thức như SMTP và HTTP và như vậy)).
- A
FILE *
cung cấp cho bạn khả năng sử dụng fscanf
và các chức năng stdio khác.
- Mã của bạn một ngày nào đó có thể cần phải được chuyển sang một số nền tảng khác chỉ hỗ trợ ANSI C và không hỗ trợ
open
chức năng.
Theo ý kiến của tôi, bản dịch kết thúc dòng thường cản trở bạn hơn là giúp bạn và việc phân tích cú pháp fscanf
yếu đến mức bạn chắc chắn sẽ ném nó ra để ủng hộ thứ gì đó hữu ích hơn.
Và hầu hết các nền tảng hỗ trợ C đều có open
chức năng.
Điều đó để lại câu hỏi đệm. Ở những nơi bạn chủ yếu đọc hoặc viết một tệp tuần tự, hỗ trợ bộ đệm thực sự hữu ích và cải thiện tốc độ lớn. Nhưng nó có thể dẫn đến một số vấn đề thú vị trong đó dữ liệu không kết thúc trong tệp khi bạn mong đợi nó ở đó. Bạn phải nhớ fclose
hoặc fflush
vào những thời điểm thích hợp.
Nếu bạn đang làm tìm kiếm (aka fsetpos
hoặc fseek
thứ hai trong số đó là một chút phức tạp hơn để sử dụng một cách phù hợp tiêu chuẩn), tính hữu ích của đệm nhanh chóng đi xuống.
Tất nhiên, sự thiên vị của tôi là tôi có xu hướng làm việc với các socket rất nhiều, và có một thực tế là bạn thực sự muốn thực hiện IO không chặn (điều này FILE *
hoàn toàn không hỗ trợ theo bất kỳ cách hợp lý nào) mà không có bộ đệm nào cả và thường xuyên có yêu cầu phân tích phức tạp thực sự tô màu nhận thức của tôi.
fdopen
vàopen
hayfopen
vàopen
?