Entwickler-Ecke

Basistechnologien - mehrdimensionales Array


Susilein - Mi 15.04.09 19:54
Titel: mehrdimensionales Array
Hallo,

ich bin Anfängerin und habe in einer Konsolenanwengung ein byte []array mit 77 objekten programminert.
zb : byte[] content = { 1, 2, 3, 4 , usw..};

Ich habe nur noch ein Problem
ich wollte die arrays in eine txt einlesen und diese auf konsole wieder ausgeben.
das funktioniert schon nur bekomme ich keinen gruppierten zeilenumbruch als AUsgabe hin zb so:

12345678
910111213
usw.

kann mir jemand helfen? :-)
lg susanne


Kha - Mi 15.04.09 20:31

:welcome:

Also entweder ist "gruppierter Zeilenumbruch" kein anerkannter Fachbegriff oder ich habe was verpasst :) . Sollen in jede Zeile jeweils acht Zahlen? Dann brauchst du auf jeden Fall zwei verschachtelte Schleifen (ein mehrdimensionales Array eher nicht :) ) und musst dir überlegen, mit welcher mathematischen Formel du in der inneren den richtigen Index errechnen kannst.


Susilein - Mi 15.04.09 20:53

Hallo und danke für die Antwort.

also benötige ich kein mehrdimensionales array ?

Ich will ein byte[] array:

in eine Datei schreiben und wieder auslesen:
das Funktioniert ja alles schon einwandfrei nur leider weiss ich nicht wie ich zb nach jedem 8. array einen Zeilenumbruch erzwinge.
hier ist der code


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ESA
{
    class Program
    {


        public void ESA3In(string pfad, byte[] array)
        {
            FileStream stream1 = File.Open(pfad, FileMode.Create);
            stream1.Write(array, 0, array.Length);
            stream1.Close();

        }
        public void ESA3Out(string pfad)
        {
            FileStream stream2 = File.Open(pfad, FileMode.Open);
            byte[] array = new byte[stream2.Length];
            stream2.Read(array, 0, (int)stream2.Length);
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write( array[i]);
            }
            Console.WriteLine();
            stream2.Close();
        }
        static void Main(string[] args)
        {
            Program test = new Program();
            string pfad = @"C:\Musterneu.txt";
            byte[] content =  { 1234,5,6,7,8,9,
                                10,11,12,13,14,15,16,17,18,
                                19,20,21,22,23,24,25,26,27};



            test.ESA3In(pfad, content);
            test.ESA3Out(pfad);


Moderiert von user profile iconChristian S.: Beiträge zusammengefasst

Die ausgabe auf console soll dann so aussehen:

1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,
19,20,21,22,23,24,25,26,27

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


CSharper2 - So 19.04.09 15:26

hi susilein,

so wie ich das jetzt erkenne, soll nach jedem 9. indexer in deinem array ein zeilenumbruch erfolgen?!?! richtig?
wenn dem so ist, dann lasse doch einfach in deiner for-schleife einen counter mitlaufen.

diesen zählst du hoch. wenn du alle 9 elemente hast, machst du n zeilenumbruch und setzt ihn zurück:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
public void ESA3Out(string pfad)
{
   int counter = 1;                              // counter
   FileStream stream2 = File.Open(pfad, FileMode.Open);
   byte[] array = new byte[stream2.Length];
   stream2.Read(array, 0, (int)stream2.Length);
   for (int i = 0; i < array.Length; i++)
   {
      if (counter == 10)                        // wenn größer 9 -> neue Zeile
      {
         Console.Write("Zeilenumbruch");         // "Zeilenumbruch" müsste Environment.Newline sein?!?!?
         counter = 1;
      }
      else
      {
         Console.Write( array[i]);
         counter += 1;
      }
   }
   Console.WriteLine();
   stream2.Close();
}


JüTho - Di 21.04.09 12:23

Hallo,

nach einem Kurzurlaub habe ich mir noch die letzten Probleme durchgelesen. Hierzu wollte ich noch meinen Senf dazugeben:

Das Einfachste ist sicherlich die zweite Variable, aber es gibt doch auch die mod-Anweisung:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
// von CSharper2 übernommen und angepasst
public void ESA3Out(string pfad)
{
   // counter kann entfallen
   FileStream stream2 = File.Open(pfad, FileMode.Open);
   byte[] array = new byte[stream2.Length];
   stream2.Read(array, 0, (int)stream2.Length);
   for (int i = 0; i < array.Length; i++)
   {
      Console.Write( array[i].ToString() + "," );
      if (i % 9 == 8)                        // nach je 9 Elementen -> neue Zeile
      {
         Console.Write( Environment.NewLine );        
      }
   }
   Console.WriteLine();
   stream2.Close();
}

Nicht wundern über "module gleich 8": Der Laufindex fängt bei 0 an, also muss die neue Zeile ein Element vor "gleich 0" kommen.

@CSharper2
Man kann natürlich if-else verwenden. Dann ist es aber einfacher, zwischen Write(array[i]) und WriteLine(array[i]) zu unterscheiden, und überlässt den richtigen Zeilenvorschub dem Framework.

@Susilein
Bitte formuliere deine Beiträge etwas sorgfältiger.
Zitat:
Ich will ein byte[] array... nur leider weiss ich nicht wie ich zb nach jedem 8. array einen Zeilenumbruch erzwinge.

Nach deinem Beispiel willst nach jeweils neun Zahlen einen Zeilenumbruch eingeben, nicht nach 8. Dabei handelt es sich um Array-Elemente, aber nicht um ganze Arrays. Selbst wenn du ein zweidimensionales Array verwenden würdest (was in der Tat nicht erforderlich ist), würde die neue Zeile nach jedem einzelnen Array der einen Ebene kommen.

Gruß Jürgen