Entwickler-Ecke

Basistechnologien - streamreader in ushort


HoPPeL - Do 17.03.11 15:40
Titel: streamreader in ushort
hiho, möchte eine .dat auslesen und dessen Werte in ein ushort array packen. Habe das ganze jetzt versucht so zulösen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public void DataLoad(string Filename)
        {
            StreamReader sr = new StreamReader(Filename);
            ushort[] ImageData = {};
            int i = 1;

            while (! sr.EndOfStream)
            {
                ImageData[i] = ushort.Parse(sr.ReadLine());
                i++;
            }
            sr.Close();

            int j = 0;
            while (ImageData != null)
            {
                MessageBox.Show(ImageData[j].ToString() + "\n");
            }
        }


schaut m.M. eigentlich ganz gut aus, aber wenn ich die methode ausführen will bekomm ich immer "Der Index war außerhalb des Arraybereichs." als fehlermeldung... ist while (! sr.EndOfStream) nicht geeignet um zu gucken ob noch Zeilen vorhanden sind, oder was ist das Problem?

mfg


Ralf Jansen - Do 17.03.11 15:49


C#-Quelltext
1:
ushort[] ImageData = {};                    


Du hast ein Array der Länge 0 angelegt. Es gibt also nicht ein gültiges Element im Array somit wird jeder Zugriff auf eine IndexOutOfBoundsException laufen. Du must schon, wenn du ein Array benutzen willst, das in der richtigen Größe anlegen. Da du das vorraussichtlich vorher nicht weißt wäre eine List<ushort> [http://msdn.microsoft.com/de-de/library/6sh2ey19.aspx] wohl geeigneter. Übrigens ist ein Array 0 basiert und nicht 1 basiert. Dein Code legt den Index 0 nicht an(unter der Annahme dein Code würde funktionieren) aber nachher versuchst du trotzdem den auszugeben. Und das unendlich oft da ImageData zwar leer ist aber natürlich existiert und mehr prüfst du nicht in der 2.ten while Schleife.


jaenicke - Do 17.03.11 15:49

user profile iconHoPPeL hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
public void DataLoad(string Filename)
        {
            StreamReader sr = new StreamReader(Filename);
            ushort[] ImageData = {};
            int i = 1;

            while (! sr.EndOfStream)
            {
                ImageData[i] = ushort.Parse(sr.ReadLine());
                i++;
            }
Du erzeugst ein leeres Array und weist dann den i-ten Eintrag zu.


HoPPeL - Do 17.03.11 16:04

achso, ja alles klar... danke für die hilfe, habs jetzt einfach in eine Liste gepackt :)

mfg


thas11 - Do 17.03.11 17:55

Hi!

Ich habs zwar nicht ausprobiert, aber sollte die Variable i nicht mit 0 initialisiert werden ?


HoPPeL - Fr 18.03.11 12:42

also nochmal eine frage:

immer wenn ich jetzt folgenden Code ausführe, bekomme ich ne OUTOFMEMORY meldung!


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
StreamReader sr = new StreamReader(Filename);

            List<ushort> CamData = new List<ushort>();

            while (!sr.EndOfStream)
            {

                CamData.Add(ushort.Parse(sr.ReadLine()));
            }

            sr.Close();


Ralf Jansen - Fr 18.03.11 13:08

Wie groß ist den deine .Dat-Datei?
Eine generische Liste von ValueTypes sollte bei 2GB dicht machen.


HoPPeL - Fr 18.03.11 13:50

habe extra zum testen ne kleine .dat angelegt mit folgenden werten

23264
22960
23280
23648
23712
23712
24144
24128
24912
25008

dennoch tritt der Fehler auf :(


jaenicke - Fr 18.03.11 14:20

Wie wäre es, wenn du Peek statt EndOfStream benutzt wie im Beispiel in der Doku?
http://msdn.microsoft.com/de-de/library/system.io.streamreader.readline.aspx


HoPPeL - Fr 18.03.11 14:33

ohhh :oops: ... das löst mein problem!
danke

mfg