File io 如何读取MIT/GNU方案中的文本文件?

File io 如何读取MIT/GNU方案中的文本文件?,file-io,scheme,mit-scheme,File Io,Scheme,Mit Scheme,我一直在学习SICP,我想应用到目前为止我学到的一些概念。也就是说,积累、映射和过滤将帮助我在工作中更高效。我主要使用CSV文件,我知道MIT/GNU方案不支持这种文件格式。但这没关系,因为我可以将CSV文件导出为txt文件,因为支持txt文件 现在我阅读了手册的第14节输入/输出,坦率地说,缺乏具体的示例并不能帮助我开始学习。因此,我希望你们中的一些人能给我一个领先的开始。我有一个文本文件foo.txt,由变量和国家列表的观察值组成。我只想把这个文件读入Scheme并处理数据。谢谢你的帮助。任

我一直在学习SICP,我想应用到目前为止我学到的一些概念。也就是说,积累、映射和过滤将帮助我在工作中更高效。我主要使用CSV文件,我知道MIT/GNU方案不支持这种文件格式。但这没关系,因为我可以将CSV文件导出为txt文件,因为支持txt文件

现在我阅读了手册的第14节输入/输出,坦率地说,缺乏具体的示例并不能帮助我开始学习。因此,我希望你们中的一些人能给我一个领先的开始。我有一个文本文件foo.txt,由变量和国家列表的观察值组成。我只想把这个文件读入Scheme并处理数据。谢谢你的帮助。任何示例代码都会有帮助

(call-with-input-file "my_file.txt"
  (lambda (port)
    (read port))) ; reads the file's contents

一般情况下,请参阅参考手册上的。Scheme提供了几种读取文件的方法。您可以使用“打开/关闭”样式,如下所示:

(let ((port (open-input-file "file.txt")))
  (display (read port))
  (close-input-port port))
您还可以使用igneus的answer,它将端口传递给过程,并在过程结束时自动关闭端口:

(call-with-input-file "file.txt"
  (lambda (port)
    (display (read port))))
最后,我的最爱,将当前输入端口更改为从文件读取,运行提供的过程,关闭文件,并在结束时重置当前输入端口:

(with-input-from-file "file.txt"
                      (lambda ()
                        (display (read))))
您还需要阅读关于的部分。上面使用的“read”函数仅从端口读取下一个Scheme对象。还有读取字符、读取行等。如果您已经从文件中读取了所有内容,那么您将得到eof对象?将返回true on-如果您正在循环文件以读取所有内容,则此选项非常有用

e、 g.将文件中的所有行读入列表

(with-input-from-file "text.txt"
  (lambda ()
    (let loop ((lines '())
               (next-line (read-line)))
       (if (eof-object? next-line) ; when we hit the end of file
           (reverse lines)         ; return the lines
           (loop (cons next-line lines) ; else loop, keeping this line
                 (read-line))))))       ; and move to next one

谢谢你,伊涅斯。既然您提供了一个简单的示例,我将再次阅读该部分。我第一次读它时,由于缺乏具体的例子,我很难理解。非常感谢彼得。我现在听从你的建议,效果很好。谢谢你的帮助。