2012-02-19 27 views
15

Tôi được một người phỏng vấn hỏi rằng tôi sẽ triển khai như thế nào tail (có, một trong vỏ linux). Câu trả lời của tôi là, trước tiên hãy tìm đến cuối tập tin, sau đó đọc từng ký tự một, nếu gặp một số \n, có nghĩa là một dòng bị đứt, blah blah blah. Tôi cho rằng câu trả lời của tôi là chính xác.sự khác nhau giữa `fseek`,` lseek`, `seekg`,` seekp` là gì?

Sau đó, tôi đã tìm thấy sự cố này, tôi nên tìm cách nào để triển khai tail? Tôi nghĩ rằng tôi chỉ có thể sử dụng seekg (điều C++?), Nhưng tôi đã nói rằng tôi nên sử dụng lseek (gọi hệ thống Linux?).

Vì vậy, bao gồm fseek (điều ANSI C?), Tôi nên sử dụng loại nào để triển khai tail? Và có bất kỳ sự khác biệt lớn giữa chúng?

+3

Khá chắc chắn 'fseek' chỉ là một trình bao bọc cho' lseek' trên Linux. –

+0

@JamesMcLaughlin, tôi mong đợi điều đó. – Alcott

Trả lời

14

Sử dụng seekg khi sử dụng thư viện IOstream của C++. seekp không được sử dụng ở đây, vì nó đặt con trỏ đặt.

Sử dụng fseek khi sử dụng thư viện stdio C. Sử dụng lseek khi sử dụng trình mô tả tệp I/O POSIX cấp thấp.

Sự khác biệt giữa các hàm tìm kiếm khác nhau chỉ là loại đối tượng tệp/luồng mà chúng hoạt động. Trên Linux, seekgfseek có thể được triển khai theo điều khoản của lseek.

+0

Vì vậy, tôi có thể triển khai thành công 'tail' bằng cách sử dụng 'fseek' trong' C' hoặc 'seekg' trong' C++', phải không? – Alcott

+0

@Alcott: Có. 'seekg'/IOstreams là thư viện I/O bản địa C++, nhưng stdio có thể nhanh hơn. Lựa chọn của bạn. –

+0

Tôi đang sử dụng Linux, vậy tôi có nên chọn 'lseek' trên' fseek' không? – Alcott

Các vấn đề liên quan