0

我从文件中得到一个随机行:

using (FileStream ifs = new FileStream(path, FileMode.Open, FileAccess.Read)) {
    using (StreamReader sr = new StreamReader(ifs, Encoding)) {
        long lastPos = ifs.Seek(0, SeekOrigin.End);
        long rndPos = 0;
          do {
              rndPos = (long)(Random.NextDouble() * lastPos);// Random is property
              ifs.Seek(rndPos, SeekOrigin.Begin);
              sr.ReadLine();
              line = sr.ReadLine();
          } while (string.IsNullOrWhiteSpace(line));
    }
}

但有时事实证明,这条线总是空的,而循环是无限的。请问,我哪里错了?

此函数被调用 1000 次(例如)。前100次调用成功,但随后主流的位置是最后一个位置,seek没用。

ps:我想在文件中获得一个随机位置。然后通读该位置所在的行到末尾,并作为结果返回下一行。循环获取大文件的随机字符串是最快的算法。是的,我知道这个函数永远不会返回第一行。

4

2 回答 2

0

好吧,如果该行为空,并且您的条件为 string.IsNullOrWhiteSpace(line),这将是一个无限循环。

于 2013-02-14T06:59:03.083 回答
0
public string ReturnRandomLine(string path, ref Random r)
{
    string[] lines = File.ReadAllLines(path);
    string randomLine = String.Empty;
    int randomLineNumber;

    do
    {
        randomLineNumber = r.Next(0, lines.Length - 1);
        randomLine = lines[randomLineNumber];
    } while (String.IsNullOrWhiteSpace(randomLine));

    return @"Line #" + randomLineNumber + " " + randomLine;
}
于 2013-02-14T06:59:14.680 回答