C# ReadLine()

Stephan78

Ensign
Registriert
Sep. 2010
Beiträge
162
Hallo,

ich bringe folgenden Code nicht zum Laufen. Zunächst soll die Anzahl der Zeilen im txt-File
bestimmt werden, anschließend sollen die Daten im txt-File ausgelesen werden.
Ersteres funktioniert noch, letzteres nicht mehr.
Liegt das evtl. daran, daß man den Streamreader nach dem ersten Durchlauf beim Zeilen zählen erst wieder auf die erste Zeile setzen muss, damit er die Datei einlesen kann? Wenn nein, was muss man ändern, damit es läuft?
Vielen Dank schon im Vorraus an die Experten :)
Gruß, Stephan

Code:
public string[,] tabelle(string pfad, string trennzeichen)
		{
			//initialisieren
			string[,] table={{"",""},{"",""}};
			
			try
				{
					// Sets the file the Reader will read from
					//var reader= File.OpenText(pfad);
					StreamReader reader = new System.IO.StreamReader(pfad);
					int linecount=0;
					while (reader.ReadLine()!=null)
					{
						//Anzahl der Zeilen bestimmen
						linecount++;
					}
					
					//Matrix dimensionieren
					table = new string[linecount, 2];
					//Matrix einlesen
					for (int i = 0; i < linecount; i++) 
					{
						string zeile=reader.ReadLine();
						Print(zeile);
						string[] datensatz=Regex.Split(zeile, trennzeichen);
						table[i,0]=datensatz[0];
						table[i,1]=datensatz[1];
						Print(table[i,0]);
					}
				}
			catch (System.Exception excep)
				{
					MessageBox.Show(excep.Message);	
				}
				
			return table;
		}
 
Warum benutzt du nicht File.ReadAllLines(Pfad) und Füllst danach deine Tabelle?

Noch etwas: Wenn du Streams verwendest, oder andere Klassen die IDisposable Implementieren dann nutz doch bitte den using-Block um die Ressourcen ordnungsgemäß wieder freizugeben.
Ergänzung ()

Zu deiner eigentlichen Frage mit ReadLine: Nachdem REadLine() null ist, ist der Datei-Zeiger am ende der Datei, du müsstest ihn also nochmal auf den Begin setzen, oder die Datei nochmal öffnen, was aber weniger performant ist wie das neu setzen des Dateizeigers.
Aber vielleicht hilft dir ja auch schon das mit ReadAllLines()
 
Warum machst du das überhaupt getrennt? Lies doch erst alle Zeilen ein(dann hast du gleich auch die Anzahl der Zeilen...).

Wenn ich mich recht entsinne hast du sonst beim StreamReader unnötige IO Requests...
 
wieso packst du die for und while schleife nicht zusammen?
StreamReader reader = new System.IO.StreamReader(pfad);
string input = "";
while((input = reader.readLine()) != null){
//Hier steht Code
}
so musst du nicht erst die zeilenanzahl speichern
 
Guck mal in meiner Signatur oder nimm gleich den Link hier:
http://dotnet-snippets.de/dns/textdatei-einlesen-auf-verschiedene-arten-SID1331.aspx

Das hier kannst du in eine Konsolen Anwendung in die Main kopieren und halt den Pfad zu einer Datei anpassen...
Das soll nur ein kleines Beispiel sein. ;)
Code:
// liest alle Zeilen aus der Textdatei ein
var fileContent = File.ReadAllLines("test.txt", Encoding.Default);

// Zählen der Zeilen
Console.WriteLine("Zeilenanzahl: {0}", fileContent.Count());

Console.WriteLine("Inhalt der Datei:");
// ausgeben, Zeile für Zeile:
foreach (var line in fileContent)
{
    Console.WriteLine(line);
}
 
-Danke für die Infos!
mit FIle.ReadAllLines funzt es. Diese Variante kannte ich bis dato noch nicht.
Nur aus Interesse-wie setzt man den Streamreader-Zeiger auf die erste Zeile zurück,
wenn er bereits einmal durchgelaufen ist?
 
Kannst du wieder direkt in eine Konsolen Anwendung übernehmen.
Zur Information solltest du dir den MSDN Link mal angucken. ;)

Code:
using (var reader = new StreamReader("test.txt", Encoding.Default))
{
    while (!reader.EndOfStream)
    {
        Console.WriteLine(reader.ReadLine());

        if (!reader.EndOfStream) 
            continue;

        Console.WriteLine("Go to start of File!");
        reader.BaseStream.Seek(0, SeekOrigin.Begin);
        Console.ReadKey(true);
    }
}
 
Zurück
Oben