使用StreamReader从文本文件中读取新行

时间:2011-08-24 10:40:59

标签: c# .net vb.net

我在文件中存储的是与帐户相关的值。 (只是测试,不会在商业上使用)。我需要的是通过遍历每一行来绘制用户名和密码的值,但.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;
    }

我的代码不会从第二行开始读取,只是挂起。

4 个答案:

答案 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;