текстовый файл: чтение строка за строкой C#

Итак, предположим, у меня есть текстовый файл с 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 ответов


В общем, было бы лучше, если бы вы могли создать это таким образом, чтобы оставить файл открытым, а не пытаться открывать файл каждый раз.

если это не практично, вам нужно позвонить 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++;
}

один простой вызов должен сделать это:

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

вы захотите проверить, что файл существует, и, конечно, вам все равно нужно следить за пустыми строками или недопустимыми значениями, но это должно дать вам основы. Чтобы зациклить файл, вы можете использовать следующее:

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

еще одна заметка-Вы не захотите делать это с большими файлами, так как он обрабатывает все в памяти.


Ну, если вы действительно не возражаете против повторного открытия файла каждый раз, вы можете использовать:

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

тем не менее, я бы посоветовал вам просто прочитать все это за один раз, используя File.ReadAllLines, или, возможно,File.ReadLines(...).ToList().


на ReadLine метод уже читает следующую строку в StreamReader, вам не нужен счетчик или ваша пользовательская функция в этом отношении. Просто продолжайте читать, пока не дойдете до 20 строк или пока файл не закончится.


вы не можете передать номер строки 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
}