Entwickler-Ecke
IO, XML und Registry - IndexOutOfRangeException was unhandled(Sourcecodeprob.)
Concept-X - Fr 15.02.08 22:43
Titel: IndexOutOfRangeException was unhandled(Sourcecodeprob.)
Hi,
bevor ich hier die Krise bekomme, möchte ich euch eine Frage stellen...
Also, ich habe folgenden Code zusammengebastelt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public string get_config(string sFilename, int iLine) { string sText = ""; string[] seperator = { "\r\n" }; if (File.Exists(sFilename)) { StreamReader openFile = new StreamReader(sFilename, System.Text.Encoding.Default); sText = openFile.ReadToEnd(); openFile.Close(); } string[] sRow = sText.Split(seperator, StringSplitOptions.None); return sRow[iLine]; } |
Das ganze ließt den Inhalt einer Datei(sFilename) aus und gibt genau den Inhalt einer Zeile wieder(iLine)...
Ich habe es zuerst auf primitive Art und Weise durchlaufen lassen und den Wert von z.B. Zeile 2 an ein Label gegeben:
C#-Quelltext
1:
| label1.Text = get_config(@"Text.txt", 1); |
Es funktioniert auch wunderbar und er gibt mir genau die 2.Zeile der Datei Text.txt wieder...
Nun aber habe ich versucht den Inhalt aus der 2. Zeile einem timer zuzuweisen:
C#-Quelltext
1:
| timer_refresh.Interval = Convert.ToInt32(get_config(@"Text.txt", 1))*1000; |
//*1000, damit der Inhalt den Sekunden entspricht...
Allerdings zeigt mir nun der Quelltext folgenden Fehler an:
IndexOutOfRangeException was unhandled
Der Fehler wird mir in der Zeile
return sRow[iLine]; angezeigt...
Nachdem ich jetzt schon fast die komplette msdn-Hilfe diesbezüglich durchforstet habe, verstehe ich die Welt nicht mehr... ich hoffe ihr könnt mir helfen =(
Christian S. - Fr 15.02.08 23:29
Ich kann nur raten:
Durch irgend etwas, was Du vor der Zuweisung zum Timer-Intervall tust, ändert sich das Arbeitsverzeichnis. Dadurch wird die Datei nicht gefunden (Du gibst ja keinen Pfad an, was man immer machen sollte). Das Array mit den Zeilen ist leer -> krawumm
P.S.: Ändere bitte den Titel Deines Thread, der ist nicht so schrecklich aussagekräftig.
P.P.S.: Wieso liest Du die komplette Datei ein, wenn Du nur die erste Zeile haben willst?
Concept-X - Fr 15.02.08 23:55
Hmm... es könnte wirklich am fehlen eines absoluten Pfades liegen... kannst du mir sagen wie ich den Pfad bekomme? Also so, dass wenn ich die *.exe irgendwo anders hinkopiere ich nicht den Sourcecode komplett ändern muss...
Naja, zu P.P.S.: ich brauch immer wieder unterschiedliche Zeilen:
Die Datei sieht wie folgt aus:
Zitat: |
//Einstellungen:
1
393
335
671
536 |
Die für mich in diesem Teil wichtige Zeile ist die 2. Zeile, also im Bsp. wegen dem Array-Index der Inhalt des 1.Arrayindex...
In anderen Programmteilen hole ich mir die 3.,4.,usw. Zeile heraus...
Christian S. - Sa 16.02.08 00:05
Schau Dir mal
Application.StartupPath an, das sollte das sein, was Du brauchst.
Ich würde die Datei irgendwie so durchsuchen:
Delphi-Prism-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| result := ''; var currentLine := 0; using sr := new StreamReader(sFilename) do while not sr.EndOfFile do begin result := sr.ReadLine; if currentLine = iLine then exit; currentLine := currentLine + 1; end; |
Concept-X - Sa 16.02.08 02:10
Danke!
In C# würde es dann in etwa so aus(ich habe es nie getestet!):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public string get_config(string sFilename, int iLine) { string content = ""; int currentLine=0; StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default); while(!myFile.EndOfStream) { content=myFile.ReadLine(); if(currentLine==iLine) { currentLine++; } } return content; } |
Ich habe meinen Fehler erkannt... ich werde nie mehr mit zu komplizierten Dateinamen arbeiten :wink:
Es lag am Ende nicht an dem Pfad, sondern wie ich mit bedauern, nachdem ich deinen Chrome-Quelltext in C# umgeschrieben hatte, bemerken musste an dem Fehlen eines Buchstabens im Aufruf... "Text.txt" hatte ich nur als Bsp. eingefügt... ich hatte mich schlicht vertippt :oops:
Christian S. - Sa 16.02.08 12:10
Das Schleifen-Innere in C# muss so aussehen:
C#-Quelltext
1: 2: 3: 4: 5:
| content=myFile.ReadLine(); if(currentLine==iLine) break;
currentLine++; |
So liest er immer nur bis zu der Zeile, die Du haben willst und nicht die ganze Datei.
//edit: Ach ja, und das using-Statement sollte man auch in C# benutzen, weil es den Reader auch direkt disposed.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!