2010-07-07 34 views
5

Tôi đang tìm các cách đọc/ghi dữ liệu khác nhau từ stdin/stdout. Hiện tại tôi biết về scanf/printf, getchar/putchar và được/đặt. Có cách nào khác để làm điều này không? Ngoài ra tôi rất thú vị khi biết rằng cái nào hiệu quả nhất về mặt bộ nhớ và không gian.Phương pháp I/O trong C

Cảm ơn trước

+6

đọc một cuốn sách, chẳng hạn như ngôn ngữ lập trình C. Và các hoạt động I/O thường không bị ràng buộc CPU. –

Trả lời

2

stdio được thiết kế để được khá hiệu quả cho dù bạn thích đọc dữ liệu theo cách nào. Nếu bạn cần thực hiện đọc và ghi ký tự theo từng ký tự, chúng thường mở rộng tới các macro chỉ truy cập bộ đệm trừ khi nó đầy/trống. Đối với văn bản dòng io, hãy sử dụng puts/fputsfgets. (Nhưng KHÔNG BAO GIỜ sử dụng gets vì không có cách nào kiểm soát số byte sẽ đọc!) Gia đình printf (ví dụ: fprintf) tất nhiên là cực kỳ hữu ích cho văn bản vì nó cho phép bạn bỏ qua xây dựng bộ đệm tạm thời trong bộ nhớ trước khi viết (và do đó cho phép bạn tránh suy nghĩ về tất cả các vấn đề cấp phát bộ nhớ, tràn, vv). fscanf có xu hướng kém hữu ích hơn nhiều, nhưng chủ yếu là do rất khó sử dụng. Nếu bạn nghiên cứu tài liệu cho số fscanf tốt và tìm hiểu cách sử dụng %[, %n và các số thông số, nó có thể rất mạnh mẽ!

Đối với các khối văn bản lớn (ví dụ: tải toàn bộ tệp vào bộ nhớ) hoặc dữ liệu nhị phân, bạn cũng có thể sử dụng các chức năng freadfwrite. Bạn nên luôn vượt qua 1 cho đối số kích thước và số byte để đọc/ghi cho đối số đếm; nếu không nó không thể nói từ giá trị trả về bao nhiêu đã được đọc hoặc viết thành công.

Nếu bạn đang ở trên một hệ thống hợp lý POSIX-like (khá nhiều bất cứ điều gì), bạn cũng có thể sử dụng chức năng cấp dưới io open, read, write, vv Đây là những KHÔNG một phần của tiêu chuẩn C nhưng phần của POSIX và các hệ thống không POSIX thường cung cấp các chức năng giống nhau nhưng có thể có hành vi hơi khác (ví dụ: các bộ mô tả tệp có thể không được đánh số tuần tự 0,1,2, ... như POSIX sẽ yêu cầu).

0

Nếu bạn đang tìm kiếm ngay lập tức chế độ loại thứ đừng quên về Curses (áp dụng thêm về phía * NIX mà còn có sẵn trên Windows)