我在文件中存储的是与帐户相关的值。 (只是测试,不会在商业上使用)。我需要的是通过遍历每一行来绘制用户名和密码的值,但.peek()似乎对我不起作用。我究竟做错了什么?我的块看起来像这样:
public string CheckAccount(string username, string password)
{
StreamReader sr;
string filename = "H:\\AccountInfo.txt";
string s;
string result = "";
sr = File.OpenText(filename);
s = sr.ReadLine();
string usernameFromText;
string passwordFromText;
while (sr.Peek() >= 0)
{
usernameFromText = (s.Split(','))[0];
passwordFromText = (s.Split(','))[2];
if (username == usernameFromText && password == passwordFromText)
{
result = "Successfully Logged in!";
}
else if (username != usernameFromText || password != passwordFromText)
{
result = "Your Username / Password is Invalid!";
}
}
sr.Close();
return result;
}
我的代码不会从第二行开始读取,只是挂起。
答案 0 :(得分:6)
在你的循环中,你保持Peek
而不是调用ReadLine
。
答案 1 :(得分:4)
目前尚不清楚为什么要使用sr.Peek
...而且你永远不会从文件中读取第二行。在第一个ReadLine
之后,你永远不会真正移动文件的“光标” - 你只是反复偷看同一个角色。如果您使用的是.NET 4,最简单的方法是使用File.ReadLines
:
foreach (string line in File.ReadLines(filename))
{
string usernameFromText = (line.Split(','))[0];
string passwordFromText = (line.Split(','))[2];
if (username == usernameFromText && password == passwordFromText)
{
return "Successfully Logged in!";
}
}
return "Your Username / Password is Invalid!";
如果您使用的是.NET 3.5且文件不是太大,则可以使用File.ReadAllLines
来阅读整个文件...或者还有其他方法可以一次读取一行。< / p>
请注意,我已经将逻辑更改为我怀疑更接近您真正想要的东西 - 即如果任何的行匹配则结果是成功,否则失败。
另请注意,在原始代码中,如果在循环中抛出异常,则不会关闭阅读器 - 您应该使用using
语句来避免这种情况。
另一种选择是使用LINQ:
var query = from line in File.ReadLines()
let split = line.Split(',')
select new { user = split[0], password = split[2] };
return query.Any(x => x.user == username && x.password == password) ?
"Successfully Logged in!" : "Your Username / Password is Invalid!";
答案 2 :(得分:2)
使用File.ReadLines并将文件中的所有行读入字符串数组更简单,如下所示:
string[] lines = File.ReadLines("H:\\AccountInfo.txt");
foreach(string oneLine in lines)
{
/// do something with line
}
答案 3 :(得分:1)
string result;
StreamReader SR;
string S;
SR=File.OpenText("H:\\Account.txt");
S=SR.ReadToEnd();
SR.Close();
string words = S;
words = words.Replace("\r", string.Empty);
List<string> splitNewLine = words.Split('\n').ToList();
for (int i = 0; i <= splitNewLine.Count() - 1; i++)
{
string checkUsername = (splitNewLine[i].Split(','))[0];
string checkPassword = (splitNewLine[i].Split(','))[2];
if (Username == checkUsername && Password == checkPassword)
{
result = "Successfully logged in";
return result;
break;
}
}
result = "Wrong Login Combination";
return result;