如何在指定行数后开始读取文件

时间:2013-09-30 00:27:52

标签: c# file stream

我有以下文本文件。任务很简单:忽略蓝色的所有行,并在箭头指示的位置开始读取文件。 (我发布了一个类似的问题,但是人们的回复没有起作用,所以我决定将这些答案结合起来,并且这次正确地提问)

enter image description here

这是我的代码:

 private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            StreamReader sr = new StreamReader(File.OpenRead(ofd.FileName));

            int i = 1;

            while (!sr.EndOfStream)
            {
                if (i > 8)
                    textBox1.Text = sr.ReadLine(); // As soon as i get to the arrow         (8th line, I want to display the line in the textbox in my application.)

                sr.ReadLine();
                i++;
            }

        }
    }
}

我的问题:我不认为我的while循环是正确的。当我尝试显示while循环包含的内容时,文本框中不会弹出任何内容。其次,这是我用上面代码得到的输出:

这显然是错的,我甚至不知道0小计和671etc来自哪里。

enter image description here

我期望输出是第一条箭头线:“1 MANDT CLIENT等”

谢谢你们

3 个答案:

答案 0 :(得分:4)

您可以跳过StreamReader,只需使用File.ReadAllLines加上Skip()

var lines = File.ReadAllLines(ofd.FileName).Skip(8).ToArray();

textBox1.Lines = lines;

这假定TextBox已设置为MultiLine(textBox1.MultiLine = true;)。

附加说明

上面的LINQ查询将返回System.Linq.Enumerable.SkipIterator<string>;最后的.ToArray()会将其转换为数组,这需要将其分配给textBox1.Lines,因为该属性需要string[]

答案 1 :(得分:2)

您继续阅读直到文件末尾,用每个连续的行替换文本框的内容。如果你真的希望只是第一条未开发的行,你就需要摆脱循环:

while (!sr.EndOfStream)
{
  if (i > 8)
  {
    textBox1.Text = sr.ReadLine(); 
    break;
  }

  sr.ReadLine();
  i++;
}

或者,如果您想要所有未开发的行,

while (!sr.EndOfStream)
{
  string text = sr.ReadLine();

  if (i > 8)
    textBox1.Text += text + "\n";

  i++;
}

答案 2 :(得分:1)

  • 您不向Textbox添加文字。你重写它。
  • 如果我&gt;你双读2行并只写一行8。

while (!sr.EndOfStream)
{
    string line = sr.ReadLine();
    if (i > 8)
    {
        textBox1.Text += line + Environment.NewLine;
    }
    i++;
}

阅读文件的简单方法是使用File.ReadLines

string fileLines = File.ReadLines(ofd.FileName).Skip(8).Aggregate((current, next) => current + Environment.NewLine + next);
textBox1.Text = fileLines;