文本文件:逐行读取#

时间:2014-02-18 17:47:29

标签: c# string text-files

所以,假设我有一个包含20行的文本文件,每行有不同的文本。 我希望能够有一个包含第一行的字符串,但是当我做NextLine();我希望它成为下一行。我试过这个,但它似乎不起作用:

string CurrentLine; 
int LastLineNumber;   
Void NextLine() 
{
     System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt");
     CurrentLine = file.ReadLine(LastLineNumber + 1);
     LastLineNumber++;
}

我怎么能这样做? 提前谢谢。

5 个答案:

答案 0 :(得分:10)

通常情况下,如果您能够以打开文件的方式设计它,而不是每次都尝试重新打开文件,那会更好。

如果这不切实际,您需要多次致电ReadLine

string CurrentLine; 
int LastLineNumber;   
void NextLine() 
{
    // using will make sure the file is closed
    using(System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt"))
    {
        // Skip lines
        for (int i=0;i<LastLineNumber;++i)
            file.ReadLine();

        // Store your line
        CurrentLine = file.ReadLine();
        LastLineNumber++;
    }
}

请注意,这可以通过File.ReadLines简化:

void NextLine() 
{
    var lines = File.ReadLines("C:\\test.txt");

    CurrentLine = lines.Skip(LastLineNumber).First();
    LastLineNumber++;
}

答案 1 :(得分:4)

一个简单的电话应该这样做:

var fileLines = System.IO.File.ReadAllLines(fileName);

您需要验证文件是否存在,当然您仍然需要查看空行或无效值,但这应该为您提供基础知识。要循环文件,您可以使用以下内容:

foreach (var singleLine in fileLines) {
   // process "singleLine" here
}

还有一点需要注意 - 您不希望对大文件执行此操作,因为它会处理内存中的所有内容。

答案 2 :(得分:3)

好吧,如果你真的不介意每次重新打开文件,你可以使用:

CurrentLine = File.ReadLines("c:\\test.txt").Skip(LastLineNumber).First();
LastLineNumber++;

但是,我建议您使用File.ReadAllLinesFile.ReadLines(...).ToList()一次性阅读整篇文章。

答案 3 :(得分:2)

ReadLine方法已经读取StreamReader中的下一行,您不需要计数器或自定义函数。只需继续阅读,直到达到20行或文件结束为止。

答案 4 :(得分:1)

您无法将行号传递给ReadLine,并希望它能找到该特定行。如果您查看ReadLine documentation,您会看到它不接受任何参数。

public override string ReadLine()

使用文件时,必须将它们视为 streams 数据。每次打开文件时,都从文件的第一个字节/字符处开始。

var reader = new StreamReader("c:\\test.txt");      // Starts at byte/character 0

如果您想要阅读更多行,则必须保持流打开。

using (var reader = new StreamReader("c:\\test.txt"))
{
    string line1 = reader.ReadLine();
    string line2 = reader.ReadLine();
    string line3 = reader.ReadLine();
    // etc..
}

如果您真的想编写方法NextLine,那么您需要将创建的StreamReader对象存储在某处并且每次都使用它。有点像这样:

public class MyClass : IDisposable
{
    StreamReader reader;

    public MyClass(string path)
    {
        this.reader = new StreamReader(path);
    }

    public string NextLine()
    {
        return this.reader.ReadLine();
    }

    public void Dispose()
    {
        reader.Dispose();
    }
}

但我建议您循环播放:

using (var reader = new StreamReader("c:\\test.txt"))
{
    while (some_condition)
    {
        string line = reader.ReadLine();
        // Do something
    }
}

或者使用FileReadAllLines method

一次获取所有行
string[] lines = System.IO.File.ReadAllLines("c:\\test.txt");
for (int i = 0; i < lines.Length; i++)
{
    string line = lines[i];
    // Do something
}