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