2015-10-27 4 views
1

У меня есть следующая ситуация. Я создаю викторину в visual studio C# и хочу создать формы регистрации и входа. Когда пользователь регистрирует новую учетную запись, текстовый файл будет хранить свое имя пользователя и пароль и будет устанавливать высокий балл в 0. Каждая строка в текстовом файле выглядит так: имя пользователя, пароль, рекордер. ';' является разделителем. Я создал новый проект для создания формы регистрации/регистрации практики. Вот мой код для формы регистра:Как переопределить определенную строку в текстовом файле в C#

private void btnRegister_Click(object sender, EventArgs e) 
    { 
     if (txtPassword.Text == txtConfirmPassword.Text) 
     { 
      string newAccount = txtName.Text + ";" + txtConfirmPassword.Text + ";" + "0"; 
      TextWriter account = new StreamWriter("../../TextFile/LogonDetails.txt", true); 
      account.WriteLine(newAccount); 
      account.Close(); 
      MessageBox.Show("Account created"); 
     } 

и вот мой код формы входа

  string line = ""; 
     StreamReader myReader = new StreamReader("../../TextFile/LogonDetails.txt"); 
     string[] accounts = new string[900000]; int value = 0; 
     while ((line=myReader.ReadLine()) != null) 
     { 
      string[] data = line.Split(';'); 
      if ((data[0] == txtLoginName.Text) && (data[1] == txtLoginPassword.Text) && (int.Parse(data[2]) > int.Parse(txtScore.Text))) 
      { 
       value = 1; 
       break; 
      } 
      if ((data[0] == txtLoginName.Text) && (data[1] == txtLoginPassword.Text) && (int.Parse(data[2]) < int.Parse(txtScore.Text))) 
      { 
       value = 2; 
       break; 
      } 
      else 
      { 
       value = 3; 
      } 
     } 
     if (value == 1) 
     { 
      MessageBox.Show("Your score remains the same"); 
     } 
     else if (value == 2) 
     { 
      string updatedAccount = txtLoginName.Text + ";" + txtLoginPassword.Text + ";" + txtScore; 
      TextWriter textAccounts = new StreamWriter("../../TextFile/LogonDetails.txt"); 
      textAccounts.WriteLine(updatedAccount); 
      textAccounts.Close(); 
     } 
     else if (value == 3) 
     { 
      MessageBox.Show("Account not found"); 
     } 
    } 

Так что мой вопрос, как я могу переопределить строку, хранящуюся в текстовом файле, если в этом case 'txtScore' больше данных [2]? Я попытался создать новую строку каждый раз, когда счет больше, но это кажется неэффективным. Есть ли способ, которым я могу переопределить строку, чтобы изменить значение оценки? Любая помощь с благодарностью

+1

Вы имеете в виду 'overwrite' вместо' override'? – markpsmith

+0

Вот что я имею в виду. Я хочу удалить одну строку и добавить новую. – kris594

ответ

0

Нет прямого способа настроить таргетинг на определенную строку в текстовом файле, чтобы обновить содержимое этой строки. Я бы предложил хранить вашу информацию в формате XML (структурированные данные); У .NET уже есть возможности, встроенные для чтения и записи на определенные узлы в XML-файле.

Если вы не хотите этого делать, то мое предложение состоит в том, что вы загружаете все строки из текстового файла в память в виде экземпляров, например. a User класс, который обладает свойствами вашего имени пользователя, пароля и оценки, а затем записывает все их обратно в ваш файл данных сразу с любыми обновлениями для оценки.

Кстати, как правило, не рекомендуется хранить пароли в виде обычного текста, поэтому я надеюсь, что вы, по крайней мере, используете алгоритм хеширования.

+0

Причина, по которой я использую текстовый файл, заключается в том, что он предназначен только для простой викторины, и цель этого заключается в том, что в конце викторины отобразится оценка, и если его больше, чем предыдущий высокий балл, записанный в текстовом файле, а затем обновите его. Есть ли способ, чтобы я мог удалить эту строку и написать новую с обновленным счетом? – kris594

+0

Как я уже говорил в своем первом предложении, нет. Но вы можете очень легко загрузить все оценки в память, когда начнется ваша игра, и записать их обратно в файл, то есть перезаписать файл, когда игра выйдет. –

1

Если файл не то, что долго вы можете сделать что-то вроде этого:

String fileName = @"C:\LogonDetails.txt"; 

    var data = File 
    .ReadLines(fileName) 
    .Select(line => line.Split(';')) 
    .Select(items => { 
     if ((items[0] == txtLoginName.Text) && 
      (items[1] == txtLoginName.Text) && 
      (int.Parse(items[2]) < int.Parse(txtScore.Text))) 
     items[2] = int.Parse(txtScore.Text); 

     return items; 
    }) 
    .ToList(); // materialize in oreder to prevent file read/write collision 

    File.WriteAllLines(fileName, data); 
0

Ну, основываясь на ваш вопрос вы знаете номер строки, так что-то вроде этого:

var lines = File.ReadAllLines(@"path to file"); 
if (lines.Contains("1234")) 
{ 
lines[Array.IndexOf(lines, "1234")] = "new york"; 
} 
File.WriteAllLines(@"path to file", lines); 

попробуйте вот так.

+0

Я знаю содержание линии, а не номер строки – kris594

+0

Тогда вы можете попробовать это. 'var lines = File.ReadAllLines (@" путь к файлу "); if (lines.Contains ("1234")) { lines [Array.IndexOf (lines, "1234")] = "new york"; } File.WriteAllLines (@ "путь к файлу", строки); ' –

+0

Это сработало для вас. ?? –

Смежные вопросы