2012-10-16 25 views
9

Làm thế nào tôi có thể đặt lại "con trỏ" của một tệp để bắt đầu mà không cần mở lại nó? (? Một cái gì đó như fseek trong C)Đọc/gặm một tập tin bằng ruby ​​nhiều hơn một lần

Ví dụ, tôi có một tập tin mà tôi muốn grep cho hai mô hình:

f=open('test') => #<File:test> 
f.grep(/llo/) => ["Hello world\n"] 
f.grep(/wo/) => [] 

Có thể thiết lập lại f mà không cần mở lại tập tin?

Lưu ý: Tôi không tìm cách giải quyết; Tôi có thể tự mình suy nghĩ;).

Trả lời

15

Sử dụng rewind

Positions ios đến đầu vào, đặt lại lineno không.

f = File.new("testfile") 
f.readline #=> "This is line one\n" 
f.rewind  #=> 0 
f.lineno  #=> 0 
f.readline #=> "This is line one\n" 
4

Hãy xem tài liệu ruby ​​cho lớp học IO. Để thiết lập lại dòng:

f.pos = 0 

hoặc

f.seek 0 

Lưu ý rằng bạn cũng có thể thiết lập các dòng để một vị trí byte tùy ý với phương pháp này, nhưng hãy cẩn thận nếu các tập tin chứa các ký tự nhiều byte.

Mẹo: File.ancestors sẽ cho bạn biết chuỗi thừa kế, do đó bạn có thể tra cứu các phương pháp có thể thực hiện những gì bạn muốn (nhưng đôi khi bạn phải làm phản chiếu cao cấp hơn cho các phương pháp singleton và method_missing).

UPDATE: câu trả lời

megas' có thể sạch hơn vì rewind cũng reset lineno. Đầu ra của grep không bị ảnh hưởng bởi giá trị lineno, nhưng lineno sẽ ngày càng không chính xác trừ khi được đặt lại. Nếu bạn không quan tâm đến lineno, bạn có thể sử dụng một trong hai giải pháp của chúng tôi một cách an toàn.

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