文本文件:逐行读取 C#

9

假设我有一个包含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个回答

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++;
}

5
一次简单的调用即可完成:
var fileLines = System.IO.File.ReadAllLines(fileName);

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

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

还有一点需要注意——如果处理的文件太大,它会在内存中占用很多空间。


3
好的,如果你真的不介意每次重新打开文件,你可以使用以下方法:
CurrentLine = File.ReadLines("c:\\test.txt").Skip(LastLineNumber).First();
LastLineNumber++;

然而,我建议您使用 File.ReadAllLines 或者 File.ReadLines(...).ToList() 一次性读取整个文件。

2

你不能传递行号给ReadLine并期望它找到特定的行。如果您查看ReadLine文档,您会发现它不接受任何参数。

public override string ReadLine()

在处理文件时,您必须将它们视为数据的流。每次打开文件时,您都会从文件的第一个字节/字符开始。

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
    }
}

或者使用 File 类的 ReadAllLines 方法 一次获取所有行:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接