2017-01-24 30 views
0
にファイルから、私は、ファイル「data.txtを」から行列を読み書きしようとしています

を書きます。 マトリックスは、その中に文字列を含むリストです。 私が書いているとき、私は初めからデータを上書きする必要があります。基本的には毎回ファイルを削除します。私はこれのためにベターの解決策が必要です。 主な問題は、カップルの読み取りとファイルのwrithingsが壊れた後です。読書やScheme

システムエラー:アクセスが拒否されました;エラー番号= 5

マイコード:

;reading file returning matix of strings 
(define (file-reader file-name) 
    (define pointer (open-input-file file-name)) 
    (define (helper line) 
    (cond 
     ((equal? line eof) '()) 
     ((cons (list line) (helper (read-line pointer)))))) 
    (list-matr (helper (read-line pointer))) 
) 

;converting matrix of string to matrix of lists with strings inside 
(define (list-matr str-matr) 
    (define (helper str-matr line-num) 
    (cond 
     ((null? str-matr) '()) 
     ((= line-num 1) (cons (map (lambda (x) (string-append x "?")) (string-split (caar str-matr) "? ")) (helper (cdr str-matr) (+ line-num 1)))) 
     ((cons (string-split (caar str-matr) " ") (helper (cdr str-matr) (+ line-num 1)))))) 
    (helper str-matr 1)) 


;saving in file 
(define (writer file-name questions answers) 
    (cond 
    ((file-exists? file-name) (delete-file file-name))) 

    (write-to-file file-name (string-append (string-join questions) "\n")) 
    (define (helper cur-l ans) 
    (cond 
     ((null? ans)) 
     ((helper (write-to-file file-name (string-append (string-join (car ans)) "\n")) (cdr ans))))) 
    (helper '() answers) 
) 


(define (write-to-file path string) 
    (call-with-output-file path #:exists 'append 
    (lambda (newline) 
     (display string newline)))) 

コマンドの機能を呼び出すため。

(ファイル・リーダー「data.txtを」)

(ライター「data.txtを」質問の答え)

私はファイルを閉じないという問題がから来たと思うが、私ができますその命令をどこに置くべきかを把握していない。

私のコードは、あなたが私のファイルから行列を読み書きのための他の例を与えることができる非常に悪い場合。

ありがとうございます。

答えて

0

ファイルが破損する可能性があります。正しく閉じることはありません。

いつもファイルを上書きしないで、通常のR5RS/R7RS-small仕様の外に何かが必要です。ランダムファイルへのアクセスを許可する(最終的な)SRFIの私の頭の上に気づいていません。つまり、多くの/ほとんどのSchemeの実装は、低レベルのI/Oインタフェースを提供しています。このような欠点は、正しい量だけ上書きまたは追加するように構造を非常に慎重に追跡する必要があり、ファイル全体を書き換えるよりも多くの作業が必要になることです。

これを完全に再構築することをお勧めします。第1に、出力ファイル付き出力/出力付きファイルプロシージャは、他のフラグが立てられていない限り、出力ファイルを自動的に上書きします(ほとんどの実装では、仕様では動作が未定義となっています)。また、完了時に自動的にファイルを閉じます。 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))))