Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在c语言中重写文本文件中的特定行#_C# - Fatal编程技术网

C# 如何在c语言中重写文本文件中的特定行#

C# 如何在c语言中重写文本文件中的特定行#,c#,C#,我有以下情况。我正在c#visual studio中创建一个问答游戏,希望创建一个注册和登录表单。当用户注册新帐户时,文本文件将存储其用户名和密码,并将高分设置为0。文本文件中的每一行看起来像:username;密码;高分是分隔符。我已经创建了一个新项目来创建实践登录/注册表单。这是我的登记表代码: private void btnRegister_Click(object sender, EventArgs e) { if (txtPassword.Text == t

我有以下情况。我正在c#visual studio中创建一个问答游戏,希望创建一个注册和登录表单。当用户注册新帐户时,文本文件将存储其用户名和密码,并将高分设置为0。文本文件中的每一行看起来像:username;密码;高分是分隔符。我已经创建了一个新项目来创建实践登录/注册表单。这是我的登记表代码:

 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");
        }
    }
字符串行=”;
StreamReader myReader=新的StreamReader(“../../TextFile/LogonDetails.txt”);
字符串[]科目=新字符串[900000];int值=0;
而((line=myReader.ReadLine())!=null)
{
string[]data=line.Split(“;”);
如果((数据[0]==txtLoginName.Text)&(数据[1]==txtLoginPassword.Text)&&&(int.Parse(数据[2])>int.Parse(txtScore.Text)))
{
数值=1;
打破
}
如果((数据[0]==txtLoginName.Text)&(数据[1]==txtLoginPassword.Text)&&(int.Parse(数据[2])

因此,我的问题是,如果在本例中“txtScore”大于数据[2],如何重写存储在文本文件中的行?我试着在每次得分更高时创建一条新线,但这似乎效率低下。是否有一种方法可以覆盖该行以更改分数值?非常感谢您提供的任何帮助

没有直接的方法可以针对文本文件中的特定行来更新该行的内容。我建议您以XML(结构化数据)格式存储信息。NET已经内置了读取和写入XML文件中特定节点的功能

如果您不想这样做,那么我的建议是,您将文本文件中的所有行作为实例加载到内存中,例如,
User
类,该类的属性为您的用户名、密码和分数,然后将它们一次全部写回数据文件,并对分数进行任何更新

顺便说一句,以纯文本形式存储密码通常不是一个好主意,因此我希望您至少采用哈希算法。

如果文件没有那么长,您可以执行以下操作:

  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);
var lines = File.ReadAllLines(@"path to file"); 
if (lines.Contains("1234"))
{
 lines[Array.IndexOf(lines, "1234")] = "new york";
}
File.WriteAllLines(@"path to file", lines);
stringfilename=@“C:\logondails.txt”;
var数据=文件
.ReadLines(文件名)
.Select(line=>line.Split(“;”))
.选择(项目=>{
if((项[0]==txtLoginName.Text)&&
(项[1]==txtLoginName.Text)&&
(int.Parse(items[2])
根据您的问题,您知道行号,因此请执行以下操作:

  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);
var lines = File.ReadAllLines(@"path to file"); 
if (lines.Contains("1234"))
{
 lines[Array.IndexOf(lines, "1234")] = "new york";
}
File.WriteAllLines(@"path to file", lines);

试试这个。

你是说用
覆盖
而不是
覆盖
?是的,这就是我的意思。我想删除一行并添加新的一行。我使用文本文件的原因是它仅用于简单的问答游戏,其目的是在问答结束时显示分数,如果分数高于文本文件中记录的先前高分,则更新它。有没有一种方法可以让我删除那一行,然后用更新后的分数写一个新的?正如我在第一句中所说的,没有。但是当游戏开始时,你可以很容易地将所有分数加载到内存中,并将它们写回文件,即覆盖文件,当游戏退出时,我知道行内容而不是行号,你可以试试这个<代码>变量行=文件.ReadAllLines(@“文件路径”);if(lines.Contains(“1234”){lines[Array.IndexOf(lines,“1234”)]=“纽约”}File.writeAllines(@“文件路径”,行)