2016-12-30 10 views
0

私はチャットボットを使って作業しています。私は「学習」機能でコードを作成しようとしています。私はかなり新しくコーディングしていますが、私の問題は読んでいるストリームを閉じないで私に関係していると思われますが、私はどのように考えていません。私はこの難しさを解決する最も効率的な方法を見つけるのを助けたいと思います。ここに私のコードです。代わりに、同じハンドルでそれに読み取り/書き込み、その後、一度File.ReadLinesFile.Openファイルを使用しての別のファイルにアクセスしているため、文字列をtxtファイルに書き込めません

class Program 
{ 
    static bool isRecording = false; 
    static bool isTraining = false; 
    static bool shutdown = false; 

    static string path = Path.Combine(Directory.GetCurrentDirectory(), "memory.txt"); 

    static string inputValue; 
    static string outputValue = " "; 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Computer: Hello! I am MyAI Version 2.0."); 
     Console.WriteLine("Training?"); 
     inputValue = Console.ReadLine(); 
     inputValue = inputValue.ToLower(); 
     inputValue = inputValue.Trim(new Char[] { ' ', '.', ',', ':', ';', '*' }); 


     if (inputValue == "yes") 
     { 
      isTraining = true; 
      Console.WriteLine("Training mode set to true."); 
      Console.ReadLine(); 
     } 
     else 
     { 
      isTraining = false; 
      Console.WriteLine("Training mode set to false"); 
      Console.ReadLine(); 
     } 

     Console.Clear(); 
     CollectInput(); 

    } 

    static void CollectInput() 
    { 
     var lines = System.IO.File.ReadLines(path); 
     while (!shutdown) 
     { 
      Console.Write("User: "); 
      inputValue = Console.ReadLine(); 
      inputValue = inputValue.ToLower(); 
      inputValue = inputValue.Trim(new Char[] { ' ', '.', ',', ':', ';', '*' }); 
      StringComparison comp = StringComparison.OrdinalIgnoreCase; 

      if (inputValue == "hi" || inputValue == "hello" || inputValue == "greetings") 
      { 
       outputValue = "hi"; 
      } 
      else if (inputValue.Contains("how are you")) 
      { 
       outputValue = "good"; 
      } 
      else 
      { 
       if (isTraining) 
       { 
        if (isRecording) 
        { 
         //This is where I would like to write inputValue to path 
         isRecording = false; 
        } 
       } 
       if (File.ReadAllLines(path).Contains(inputValue)) 
       { 
        outputValue = File.ReadLines(path) 
        .SkipWhile(line => line != inputValue) 
        .Skip(1) 
        .FirstOrDefault(); 
       } 
       else 
       { 
        if (inputValue.Contains("?")) 
        { 
         outputValue = inputValue; 
         //This is where I would like to write inputValue to path 
         isRecording = true; 
        } 
        else 
        { 
         outputValue = "what about it?"; 
        } 
       } 
      } 

      Console.Write("Computer: "); 
      Console.WriteLine(outputValue); 
      outputValue = " ";  
     } 
    } 
}  

答えて

0

+0

File.Open(path、FileMode.Open); outputValue = File.ReadLines(パス) .SkipWhile(行=>行!=入力値) .Skip(1) .FirstOrDefault(); – Mattinthehat

+0

@Mattinthehatあなたはまだ 'outputValue = File.ReadLines(path)'で新しいファイルハンドルを開いています。 'File.Open'によって返されたハンドルを使用するメソッドを検索します。あなたのIDEやコンパイラは、 'File.Open'の戻り値を破棄していることを警告しなければならないと思います。 –

+0

詳しいことができますか?私はまだ新しいですし、私はコードのその部分をやり直すより良い方法を知らない。基本的にはファイルの入力をチェックし、見つかった場合はその下の行を取ります。 – Mattinthehat

0

MSDNによると、https://msdn.microsoft.com/en-us/library/dd383503(v=vs.110).aspxによれば、File.ReadLinesを使用すると、完全に読み込まれる前にファイルの行を列挙することができます。それは私の言うことは、ファイルが列挙の開始後、ある期間開いたままになっている可能性が高いということです。

非同期動作が必要ない場合は、File.ReadAllLinesに切り替えます。同様に反復処理を行うことができ、File.AppendAllLinesを使用してファイルに書き込むことができるはずです。

+0

'File.ReadAllLines'はファイルを読み終えたら閉じますか? –

+0

OK ReadAllLinesに切り替え、writetext.Close()関数をwriteメソッドに追加しました。それは今働きます! (TextWriter writetext = new StreamWriter(path、true)) { writetext.Write(Environment.NewLine);を使用して書き込み関数を呼び出す。 writetext.Write(inputValue); writetext.Close(); } – Mattinthehat

+0

@ JohnSmith、明らかにそうです。 – Markus

関連する問題