2009-08-13 36 views

Trả lời

13

EOFError là tiện dụng trong tất cả các IO, lớp đó là cơ sở của tất cả các đầu vào/đầu ra trong ruby. Bây giờ cũng nhớ khái niệm Unix cốt lõi: mọi thứ đều là một tập tin. Điều này bao gồm ổ cắm. Vì vậy, nếu bạn có một số ổ cắm mở và đang đọc từ nó, một điều kiện đặc biệt có thể là để gặp phải một kết thúc của tập tin.

Tất cả các ví dụ hiện có cho thấy sử dụng tầm thường của EOFError (trong khi đọc một số tệp văn bản), điều này không thực sự hữu ích. Tuy nhiên, bắt đầu đào qua net/http hoặc các lớp khác sử dụng ổ cắm rất nhiều và bạn sẽ thấy ngoại lệ này được sử dụng.

Edited để thêm ví dụ này từ net/ftp

def getline 
    line = @sock.readline # if get EOF, raise EOFError 
    line.sub!(/(\r\n|\n|\r)\z/n, "") 
    if @debug_mode 
    print "get: ", sanitize(line), "\n" 
    end 
    return line 
end 
+1

+1 Để có câu trả lời hay hơn. – Swanand

+1

Cảm ơn Swanand. Tôi nợ mã ví dụ để sử dụng tìm kiếm yêu thích của tôi ... "tìm /usr/lib/ruby/1.8/net/ -name * .rb -exec grep EOFError/dev/null '{}' \;" –

9

EOFError (Lỗi kết thúc tệp), được ném khi bạn cố thực hiện thao tác trên đối tượng tệp đã tham chiếu đến cuối tệp. Trong ví dụ này, chúng tôi đang cố gắng để readline khi dòng không tồn tại.

Ví dụ:

import_file = File.open(filename) 
begin 
    while (line = import_file.readline) 
    sline = FasterCSV.parse_line(line) 
    # Do stuff with sline 
    end 
rescue EOFError 
    # Finished processing the file 
end 

Điều tương tự cũng có thể đạt được nếu không có sự EOFError:

File.open(filename).each do |line| 
    sline = FasterCSV.parse_line(line) 
    # Do stuff with sline   
end 
+1

cảm ơn cho câu trả lời. tôi hiểu EOFError có nghĩa là "Kết thúc lỗi tệp". nhưng điều đó có nghĩa là gì? Nếu người đọc đến cuối tập tin, điều đó nghe có vẻ không giống với tôi. – Tony

+0

Xin lỗi, làm thế nào ngu ngốc của tôi để không xem xét. Tôi đã cập nhật câu trả lời, nhưng tôi đoán nó vẫn có thể không trả lời câu hỏi của bạn. – Swanand

+0

nếu hai tài khoản đó tương đương với việc xử lý tệp, hãy giúp một chút. cảm ơn – Tony