2014-02-18 16 views
9

So, sagen wir, ich habe eine Textdatei mit 20 Zeilen, mit auf jeder Zeile anderen Text. Ich möchte in der Lage sein, eine Zeichenfolge zu haben, die die erste Zeile enthält, aber wenn ich NextLine(); Ich möchte, dass es die nächste Zeile ist. Ich versuchte das, aber es scheint nicht zu funktionieren:Textdatei: Zeile für Zeile lesen C#

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

Wie würde ich in der Lage, dies zu tun? Vielen Dank im Voraus.

Antwort

10

Im Allgemeinen wäre es besser, wenn Sie dies so gestalten könnten, dass Ihre Datei geöffnet bleibt und nicht jedes Mal die Datei erneut geöffnet wird.

Wenn das nicht möglich ist, müssen Sie ReadLine mehrmals aufrufen:

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

Beachten Sie, dass dies über File.ReadLines vereinfacht werden kann:

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

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

Ein einfacher Anruf sollte es tun:

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

Sie wollen die Datei vorhanden ist zu validieren und natürlich müssen Sie noch für Leerzeilen oder ungültige Werte sehen, aber das sollte Ihnen die Grundlagen geben. Um Schleife über die Datei, die Sie die folgenden verwenden:

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

Noch eine Anmerkung - Sie werden es nicht tun wollen, mit großen Dateien, da es alles im Speicher verarbeitet.

3

Nun, wenn Sie wirklich die Datei nicht jedes Mal neu zu öffnen, können Sie verwenden Stören:

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

aber ich würde Ihnen raten, nur das Ganze in einem Rutsch lesen mit File.ReadAllLines oder vielleicht File.ReadLines(...).ToList().

2

Die ReadLine Methode bereits liest die nächste Linie in der StreamReader, brauchen Sie nicht den Zähler oder Ihre benutzerdefinierte Funktion für diese Angelegenheit. Lesen Sie einfach weiter, bis Sie Ihre 20 Zeilen erreichen oder bis die Datei endet.

1

Sie können keine Zeilennummer an ReadLine übergeben und erwarten, dass sie diese bestimmte Zeile findet. Wenn Sie sich die ReadLine documentation ansehen, werden Sie sehen, dass sie keine Parameter akzeptiert.

public override string ReadLine() 

Wenn mit Dateien arbeiten, müssen Sie sie behandeln, als von Datenströmen. Jedes Mal, wenn Sie die Datei öffnen, beginnen Sie beim ersten Byte/Zeichen der Datei.

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

Sie müssen den Stream geöffnet lassen, wenn Sie mehr Zeilen lesen möchten.

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

Wenn Sie wirklich eine Methode NextLine schreiben wollen, dann müssen Sie die erstellte StreamReader irgendwo und dass jedes Mal verwenden Objekt speichern.Etwas wie folgt aus:

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(); 
    } 
} 

Aber ich schlage vor, Sie entweder Schleife durch den Strom:

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

Oder die Linien auf einmal ReadAllLines method mit der File Klasse erhalten:

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