在Scheme中读取和写入文件

时间:2017-01-24 20:21:02

标签: scheme

我试图从文件" data.txt"中读取和写入矩阵。 矩阵是列在其中的字符串。 当我写作时,我想从开头写一个覆盖数据。基本上我每次都删除文件。我需要更好的解决这个问题。 可能主要的问题是,在几次读数和文件的扭曲之后会腐败。

系统错误:访问被拒绝。错误号= 5

我的代码:

httpClient.get('example.com/users')
  .then(response => JSON.parse(response.body).users[0])
  .then(userId => httpClient.get('example.com/users/' + userId))
  .catch(error => console.error(error))

用于调用函数的命令。

(文件阅读器" data.txt")

(作家" data.txt"问题答案)

我认为问题来自我不会关闭文件,但我无法弄清楚该命令的位置。

如果我的代码非常糟糕,你可以给我一些从文件中读取和写入矩阵的例子。

谢谢。

1 个答案:

答案 0 :(得分:0)

你说错了,文件会损坏 - 它从未正常关闭。

每次都不会覆盖文件,你需要的东西不符合正常的R5RS / R7RS小规格,而且我不知道任何(最终)SRFI允许随机文件访问的问题。 。也就是说,许多/大多数Scheme实现提供某种形式的低级I / O接口。这样做的缺点是你必须非常仔细地跟踪结构,以便覆盖或仅添加正确的数量,这可能比重写整个文件更有用。

我建议完全重组。首先,call-with-output-file / with-output-to-file过程将自动覆盖输出文件,除非另有标记(在大多数实现中 - 尽管规范声明行为未定义)。他们还将在完成后自动关闭文件。 call-with-input-file / with-input-from-file过程的类似行为。

您可以通过以下内容简化所有内容:

; reader 
; this could be further simplified by replacing the cons call with 
; (cons (<parse-procedure> l) r), to parse the input at the same time
(define (matrix-read filename)
  (with-input-from-file filename (lambda ()
    (let loop ((l   (read-line))
               (r   '()))
      (if (eof-object? l)
          (reverse r)
          (loop (read-line) (cons l r))))))

; I don't understand the input/output format...

; writer
(define (matrix-write filename data)
  (with-output-to-file filename (lambda ()
    (for-each 
      (lambda (l)
        ; again, I don't know the actual structure outside of a list
        (display l)
        (newline))
      data))))

如果您解释输入格式,我可以修改答案。