2009-12-17 10 views
10

(Lưu ý:. Đây là không một câu hỏi làm thế nào để tuôn một write() Đây là đầu kia của nó, vì vậy để nói chuyện.)Làm trống hoặc "tuôn ra" mô tả tệp mà không cần đọc()?

Có thể để trống một bộ mô tả tập tin có dữ liệu để được đọc trong đó mà không cần phải read() nó? Bạn có thể không quan tâm đến dữ liệu, và đọc nó tất cả do đó sẽ lãng phí không gian và chu kỳ bạn có thể có sử dụng tốt hơn cho.

Nếu không thể thực hiện được trong POSIX, bạn có thực hiện bất kỳ hệ điều hành nào không có cách nào để thực hiện điều này không?

UPDATE: Xin lưu ý rằng tôi đang nói về tập tin mô tả, không suối.

Trả lời

2

Các luồng có fclean có sẵn, làm sạch bộ đệm ghi và trả về bộ đệm đọc trở lại hệ thống IO.

http://www.gnu.org/software/hello/manual/libc/Cleaning-Streams.html

Nếu những gì bạn thực sự muốn làm là bỏ qua byte, tái định vị con trỏ tập tin là hành động đúng. Chỉ cần bỏ qua nhiều byte như bạn không muốn đọc.

http://www.gnu.org/software/hello/manual/libc/File-Position-Primitive.html#File-Position-Primitive

+0

fclean chắc chắn không phải là tiêu chuẩn từ quan điểm ngôn ngữ –

+0

đúng. Nó là một phần của GNU libc. Tôi khá chắc chắn rằng đó là có sẵn trong chỉ là về tất cả các hệ điều hành. Tôi đã cập nhật các liên kết đến hướng dẫn sử dụng GNU, thay vì gương. – jdmichal

+0

Câu trả lời phổ biến có vẻ là "lseek". Tôi sẽ chấp nhận câu trả lời của bạn vì bạn là người đầu tiên đề xuất nó. Tôi đã hy vọng cho một cái gì đó mà sẽ làm việc trên đường ống, FIFOs, vv, đó là lý do tại sao tôi chờ đợi, nhưng tôi đoán không có điều đó tồn tại. – Teddy

1

Cả read() hay flush() là một phần của chuẩn C hoặc C++, nhưng chắc chắn không ai trong số các chức năng tiêu chuẩn hỗ trợ đỏ bừng của đầu vào suối. Tôi đoán điều này phản ánh một cái gì đó không có sẵn trong các hệ điều hành cơ bản. Cách bình thường để tránh đọc một cái gì đó hoàn toàn là bỏ qua nó với một hàm seek() của một số loại.

0

Theo this, hệ thống POSIX sẽ thực hiện việc này trên fflush(stream);.

Để mở luồng để đọc, nếu tệp chưa có ở EOF và tệp có khả năng tìm kiếm, bù đắp tệp của mô tả tệp mở bên dưới sẽ được điều chỉnh để thao tác tiếp theo trên mở các giao dịch mô tả tệp bằng byte sau khi byte cuối đọc từ hoặc được ghi vào luồng đang được xóa.

+0

Điều này điều chỉnh (a) đồng bộ hóa các vị trí đọc và ghi khi xen kẽ đệm IO trên một tệp, và (b) hoàn tác tác động của bộ đệm đọc đã tiến hành trước những gì đã được yêu cầu. Không phải những gì OP yêu cầu. – ephemient

+0

Đó là dành cho các luồng chứ không phải là các bộ mô tả tệp. – Teddy

1

Nếu bạn biết số byte cần bỏ qua, bạn có thể thực hiện lseek(fd, n, SEEK_CUR); cho hệ thống POSIX. Có fseek(), cho các đối tượng FILE *. Trong POSIX, tôi nghĩ rằng bạn có thể tìm kiếm một cách an toàn trong phần cuối của tệp, ý tưởng là nếu có nhiều dữ liệu được ghi sau, để làm cho dữ liệu đi qua vị trí được đặt với lseek(), bạn sẽ có thể đọc thêm dữ liệu ngay bây giờ.

7

Nếu bạn đang làm việc với một tty, có một cái nhìn tại tcflush():

#include <termios.h> 
int tcflush(int fildes, int queue_selector); 

Sau khi hoàn thành, tcflush() vứt bỏ dữ liệu bằng văn bản cho đối tượng gọi bằng fildes (một tệp mở mô tả được kết hợp với thiết bị đầu cuối) nhưng không được truyền hoặc dữ liệu nhận được nhưng không đọc, tùy thuộc vào giá trị của queue_selector [...]

http://opengroup.org/onlinepubs/007908775/xsh/tcflush.html

+0

Cảm ơn, chính xác những gì tôi đang tìm kiếm! – Nit

0

Linux 2.6.17 hoặc mới hơn với phiên bản thư viện GNU C 2,5 hoặc sau đó chứa các cuộc gọi splice() hệ thống, có thể được sử dụng để gửi dữ liệu từ một bộ mô tả tập tin để khác mà không cần sao chép nó vào không gian người dùng. Điều này có thể được sử dụng để loại bỏ dữ liệu bằng cách chỉ cần mở /dev/nullsplice nhập dữ liệu từ bộ mô tả tệp nguồn vào bộ mô tả tệp /dev/null.