2014-02-18 4 views
9

Итак, допустим, у меня есть текстовый файл с 20 строками, причем на каждой строке разный текст. Я хочу иметь строку, в которой есть первая строка, но когда я делаю NextLine(); Я хочу, чтобы это была следующая строка. Я пробовал это, но он не работает:текстовый файл: чтение строки за строкой C#

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

Как я смогу это сделать? Спасибо заранее.

ответ

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

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

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 уже читает следующий line в StreamReader, вам не нужен счетчик или ваша пользовательская функция. Просто продолжайте читать, пока не достигнете 20 строк или пока файл не закончится.

1

Вы не можете передать номер строки ReadLine и ожидать, что он найдет эту конкретную линию. Если вы посмотрите на ReadLine documentation, вы увидите, что он не принимает никаких параметров.

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 method:

string[] lines = System.IO.File.ReadAllLines("c:\\test.txt"); 
for (int i = 0; i < lines.Length; i++) 
{ 
    string line = lines[i]; 
    // Do something 
} 
Смежные вопросы