Ruby文件I/O中的EOFError是什么?

13

官方文档 没有指定。我知道EOFError表示“文件结尾错误”,但这到底意味着什么?如果文件读取器到达文件的末尾,那对我来说并不像是一个错误。

2个回答

20

EOFError 在所有的 IO 操作中都非常方便,它是 Ruby 中所有输入/输出操作的基础类。同时也要记住 Unix 的核心概念:一切皆文件。这包括 sockets。因此,如果你打开了某个 socket 并从中读取数据,在遇到文件结尾时就会出现异常情况。

所有的示例都展示了 EOFError 的一些简单用法(比如读取文本文件),但这些用法并不是真正有用的。然而,如果你深入挖掘 net/http 或其他大量使用 sockets 的类,你会发现这个异常被广泛使用。

编辑后添加了来自 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
感谢Swanand。我将示例代码归功于我最喜欢的find用法... "find /usr/lib/ruby/1.8/net/ -name *.rb -exec grep EOFError /dev/null '{}' ;" - user155884

9

EOFError(文件结尾错误)是在您试图对已经引用到文件结尾的文件对象执行操作时抛出的。在这个例子中,我们试图readline读取不存在的行。

例如:

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

不需要使用EOFError也可以实现同样的功能:

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

1
感谢回复。我知道EOFError的意思是“文件结束错误”,但这到底是什么意思呢?如果读取器到达文件结尾,那对我来说似乎并不是一个错误。 - Tony
抱歉,我真是太愚蠢了,竟然没有考虑到这一点。我已经更新了答案,但我猜可能还不能回答你的问题。 - Swanand
如果这两种方法在文件处理方面几乎等效,那会有所帮助。谢谢。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接