2016-12-09 2 views
1

コードにパスを指定することなく、任意のテキストファイルで実行できるようにします。誰でも助けることができますか?ありがとうcmdからプログラムを実行する方法

open System.IO 
type Data() = 
    member x.Read() = 

     use stream = new StreamReader @"D:\Searcher.txt" 


     let mutable valid = true 

     printfn "Please enter the number you want to search for: " 
     let mutable x = System.Console.ReadLine() 

     let mutable lines = 1 

     while (valid) do 
      let line = stream.ReadLine() 
      if (line = null) then 
       valid <- false 
      else if (line = x) then 
       printfn "String found: %s" x 
       printfn "Found on: Line %i " lines 
       valid <- false 
      else 
       lines <- lines + 1 

let data = Data() 
data.Read() 

System.Console.ReadKey() |> ignore 
+2

何を試しましたか?あなたの目標は何ですか(期待される結果)?あなたはどんな特定の問題に遭遇しましたか? –

+2

あなたが何を求めているのかは不明です。私は、ファイルパス(ここでは 'D:\ Searcher.txt')がコマンドラインパラメータとして渡される実行可能プログラムでこのコードを実行させることを推測できます。あれは正しいですか? – TeaDrivenDev

答えて

4

ファイル名を引数として渡すには3通りの方法があります。コンパイルされたプログラムでargvを使用する場合は、fsiで実行している場合はfsi.CommandLineArgsを使用し、最後にConsole.Readlineでファイル名の引数を取得してください。これを行うためにクラスを定義する必要はないので、削除して関数にしただけです。また、関数を読み込むコードを単純化することができます。コンパイルされたプログラムargv

バージョン1

をメインに、文字列のリストとして渡されます。

open System.IO 
[<EntryPoint>] 
let main argv = 

    let fName = argv.[0] // get the file name as the first argument 

    let readData (fName:string) = 

      use stream = new StreamReader(fName) 
      let mutable valid = true 

      printfn "Please enter the number you want to search for: " 
      let mutable x = System.Console.ReadLine() 

      let mutable lines = 1 

      while (valid) do 
       let line = stream.ReadLine() 
       if (line = null) then 
        valid <- false 
       else if (line = x) then 
        printfn "String found: %s" x 
        printfn "Found on: Line %i " lines 
        valid <- false 
       else 
        lines <- lines + 1 


    readData fName 

    System.Console.ReadKey() |> ignore 
    0 // return an integer exit code 

あなたはこのように、アプリケーションをコンパイルした後、これを実行します:

.\ConsoleApplication13.exe "c:\tmp\SearchText.txt" 

バージョン2

コンパイルしたいが、ちょうどFSIを通してそれを実行しない場合:私はので、それを綴るませんバージョン3のために
Fsi.exe .\Script1.fsx "C:\tmp\SearchText.txt"

:あなたはこのように、これを実行します

open System.IO 
let fName = fsi.CommandLineArgs.[1] // you need the second item from the argument list, 
            //because the first one is the script name itself 

let readData (fName:string) = 

     use stream = new StreamReader(fName) 
     let mutable valid = true 

     printfn "Please enter the number you want to search for: " 
     let mutable x = System.Console.ReadLine() 

     let mutable lines = 1 

     while (valid) do 
      let line = stream.ReadLine() 
      if (line = null) then 
       valid <- false 
      else if (line = x) then 
       printfn "String found: %s" x 
       printfn "Found on: Line %i " lines 
       valid <- false 
      else 
       lines <- lines + 1 


readData fName 

System.Console.ReadKey() |> ignore 
0 // return an integer exit code 

検索文字列を取得するのにすでにConsole.Readlineを使用しています。ファイル名はまったく同じ方法で取得できます。

xも変更可能である必要はありません。

関連する問題