1
    open System
//helpfunction
let fileReplace filename needle replace =
  let replaceIn (reader:System.IO.StreamReader) needle (replace: String) =
    while not(reader.EndOfStream) do
      let mutable allText = reader.ReadToEnd()
      allText <- allText.Replace(needle, replace)
    reader.Close()

  //start
  let reader = System.IO.File.OpenText filename
  let newText = replaceIn reader needle replace
  let writer = System.IO.File.CreateText filename
  writer.Write newText ; writer.Close()

// testing
let filename = @".\abc.txt"
let needle = "med"
let replace = "MED"
fileReplace filename needle replace

Reader.Close() を動かしてたくさん実験しましたが、まだ結果はありません。printfn "%A" allTextの下に挿入するreader.Close()と、正しい結果が出力されることがわかっているので、 writer を呼び出すと、間違っているのではないかと思います。abc.txt の med を MED に置き換えるコードが必要です。しかし、代わりに空のabc.txtを残します

4

1 に答える 1

2

あなたが書いたreplaceIn関数は何もしません。これを分けてみましょう:

let replaceIn (reader:System.IO.StreamReader) needle (replace: string) =
    while not(reader.EndOfStream) do
        let mutable allText = reader.ReadToEnd()
        allText <- allText.Replace(needle, replace)
    reader.Close()

まず、この関数の型を見てください。

val replaceIn :  reader:System.IO.StreamReader -> needle:string -> replace:string -> unit

最初に注意すべきことは、この関数が を返すことです。これは、ファイルの内容に関係なく、常に の値を持つunitことを意味します。つまり、常にファイルに何も書き込んでいないということです。newText()

さらに、ループは不要です。ストリームの最後まで読み込んでいますが、ストリームの最後までループしています。このループは不要です。結果を格納するために作成している可変変数はループ内にあるため、ループの結果を観察する方法もありません。


それでは、別の方法を見てみましょう。

let fileReplace filename (needle : string) (replace : string) =
    let allText = System.IO.File.ReadAllText filename
    let newText = allText.Replace(needle, replace)
    System.IO.File.WriteAllText(filename, newText)

ご覧のとおり、リーダーを作成する必要さえありませんSystem.IO.File。.

于 2016-11-02T14:02:05.557 に答える