2016-12-30 4 views
0

Я работаю над чат-ботом, и я пытаюсь создать код в функции «обучения». Я довольно новичок в кодировании, но я подозреваю, что моя проблема связана с тем, что я не закрываю поток чтения, но я понятия не имею, как это сделать. Я бы хотел помочь найти наиболее эффективный способ решить эту проблему. Вот мой код.Невозможно записать строку в файл 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

Вместо использования File.ReadLines, File.Open этот файл один раз и затем чтение/запись к нему с той же ручкой.

+0

File.Open (путь, FileMode.Open); outputValue = File.ReadLines (путь) .SkipWhile (line => line! = InputValue) .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 и добавил функцию writeetext.Close() в метод записи. Он работает сейчас! heres функция записи с использованием (TextWriter writetext = новый StreamWriter (путь, истина)) { writetext.Write (Environment.NewLine); writetext.Write (inputValue); writetext.Close(); } – Mattinthehat

+0

@JohnSmith, по-видимому, так. – Markus