char mit 2D-array

Mickeyman

Mitglied
hi,
ich hab da mal ne Frage. Und zwar versuche ich ein 2 Dimensionales char-array mit Wörtern und Zahlen zu beschreiben, wo aber nur nach und nach eine Zeile ran kommen darf.

z.B.:
Code:
       Speicher [0][1][2][3][4][5][6][7]...[]
Speicher[][0]   V  o  g  e  l
Speicher[][1]   S  p  a  t  z
Speicher[][2]   J  o  h  a  n
Speicher[][3]   2  3  9  1  2
Speicher[][4]   F  e  u  e  r  1
...

Ich möchte das nämlich beim auslesen aus einer Datei benutzen.

gemeint ist das so:

Code:
FILE* Datei;
char Speicher[20][10];

for(int a=0; a<=9; a++)
{
if(!feof(Datei) fread(Speicher[0-19][a], 1, 19, Datei);
}

Bis jetzt schaffe ich das nur mit dem Umweg über ein string-array, aber das müsste doch auch irgendwie direkt mit char gehen, oder?

Erbitte Hilfe
 
Zuletzt bearbeitet:
Hi.

Speicher ist ein Array von 20 Arrays vom Typ char. D.h. du hast da für 20 Zeilen a 10 chars Platz.

Wie es aussieht möchtest du das eher anderesherum, also 10 Spalten a 20 Zeichen oder?!

Code:
char Speicher[10][20];

for (int a = 0; a < 10; a++) {
  size_t n = fread(Speicher[a], 1, 19, Datei);
  if (n == 0) /* Lese-Fehler oder Dateiende erreicht */
    break;
  /* null terminieren */
  Speicher[a][n] = '\0';
  puts (Speicher[a]);
}
Wobei C-Strings und Arrays von char im Grunde ja eigentlich dasselbe sind.

Mickeyman hat gesagt.:
Code:
Speicher[0-19][a]
0-19 ergibt übrigens -19 und das ist als Index eines Arrays sehr ungewöhnlich.

Gruß
 
Zuletzt bearbeitet:
danke für die Antwort

Es sollten tatsächlich 10 Zeilen mit je 20 Zeichen(Spalten) sein ^^

Das mit den 0-19 sollte eigentlich nur als veranschaulichung dienen.
Irgendwie verstehe ich gerade deine Funktion nicht ganz, kann es aber leider auch erst heut Abend ausprobieren.

Und zu guter letzt nehme ich Char, weil ich mich string keine Daten aus einer Datei auslesen kann. Vermute ich zumindenst^^

Werde mich auf bald noch mal melden...
 
hi,
sorry, konnte mich leider nicht früher melden.
Hab’s jetzt ausprobiert und es funktioniert tatsächlich.

Aber was mich wundert ist, dass die Variable "Speicher" zum Lesen und Schreiben nur eine Koordinate braucht. Weiß jemand vielleicht warum?

Und wie verhält sich das dann bloß mit 3D. Braucht man da dann auch nur 1 Koordinate (oder 2)? :confused:

Irgendwie irritiert mich das ganz schön...

Hoffe mir kann jemand helfen. Danke
 
Mickeyman hat gesagt.:
hi,
sorry, konnte mich leider nicht früher melden.
Hab’s jetzt ausprobiert und es funktioniert tatsächlich.

Aber was mich wundert ist, dass die Variable "Speicher" zum Lesen und Schreiben nur eine Koordinate braucht. Weiß jemand vielleicht warum?
Dazu muß man wissen das ein Array lediglich eine Aneinanderreihung von Elementen gleichen Typs ist. Die Arrayvariable selbst ist im Grunde nur ein Zeiger der auf das erste Element des Arrays zeigt. Wenn du ein ein-dimensionales Array von 20 Elementen hast und rufst
Code:
fread(array, 1, 19, datei);
auf dann speichert die Funktion fread 19 mal 1 Byte beginnend ab dem nullten Element des Arrays. Somit ist dann array[0] bis array[18] geschrieben worden (vorausgesetzt soviel Daten konnten von der Datei gelesen werden).

Wenn du solch ein statisches mehr-dimensionales Array wie char Speicher[10][20] definierst, dann befinden sich die Elemente auch direkt hintereinander, d.h. dein Array ist ein sizeof(char)*10*20 Byte großer Block im Speicher.

Wenn du keine Nullterminierung der Strings hättest machen wollen, dann hättest du auch gleich alles in das Array einlesen können - ohne eine Schleife:
Code:
fread(Speicher, sizeof(char), 10*20, datei);

Mickeyman hat gesagt.:
Und wie verhält sich das dann bloß mit 3D. Braucht man da dann auch nur 1 Koordinate (oder 2)? :confused:
Wenn du nur 1 Element ansprechen willst, dann mußt du auch alle Koordinaten angeben, willst du aber gleich 19 Elemente einlesen dann darfst du nur die Startadresse angeben ab der geschrieben werden soll.

Gruß
 
Vielen Danke für die Erklärung.

Also ich hab das so verstanden:
Code:
char Speicher[20][10];
fread(Speicher[0], 19, 1, Datei);
Er würde dann hier ab 0 19 Stellen beschreiben. (Also bis Speicher[19][0] ( mit "\0"))
Und wenn ich anschließend machen würde
Code:
fread(Speicher[1], 19, 1, Datei);
dann würde er von Position 20 weitere 19 Stellen beschreiben (bis Speicher[18][1])

Und wenn ich nur Speicher[][3] beschreiben möchte und die davor frei lassen möchte, muss ich alle Koordinaten angeben.

Ist das so richtig?
 
Mickeyman hat gesagt.:
Vielen Danke für die Erklärung.

Also ich hab das so verstanden:
Code:
char Speicher[20][10];
fread(Speicher[0], 19, 1, Datei);
Er würde dann hier ab 0 19 Stellen beschreiben. (Also bis Speicher[19][0] ( mit "\0"))
Nein, er schreibt von Speicher[0][0] über Speicher[0][9] bis Speicher[1][8]. (mit Nullterminierung bis Speicher[1][9]) Du hast irgendwie schon wieder die Dimensionen vertauscht. Speicher[0] bezeichnet Zeile 0 daran schließt sich Zeile 1 an usw. Jede Zeile hat 10 Zeichen also von Speicher[x][0] bis Speicher[x][9].
Mickeyman hat gesagt.:
Und wenn ich anschließend machen würde
Code:
fread(Speicher[1], 19, 1, Datei);
dann würde er von Position 20 weitere 19 Stellen beschreiben (bis Speicher[18][1])
Nein, er würde vom 10ten Element des Gesamtarrays anfangen und 19 Stellen schreiben. Siehe oben.

Die Berechnung der Position des Zugriffs bei mehrdimensionalen Arrays geht so:
Code:
char Speicher[m][n];
Speicher[a][b] == Element bei (Adresse von Speicher + (a * n) + b)
Mickeyman hat gesagt.:
Und wenn ich nur Speicher[][3] beschreiben möchte und die davor frei lassen möchte, muss ich alle Koordinaten angeben.
Also wenn du alle Koordinaten angibst, dann greifst du auf ein einzelnes Zeichen (char) zu und da würde sich dann der Compiler beim Aufruf der Funktion fread beschweren weil ein char kein Zeiger ist.

Gruß
 
Hallo,
jetzt hab ich endlich alles verstanden!! Danke.

Da hatte ich wohl doch eine Weile gebraucht um alles zu verstehen^^. Hab nämlich noch nicht so viel Erfahrung dabei.


Nochmals Vielen Dank
 
Zurück