2D Array wird falsch aus Datei gelesen/angezeigt

Grog

Grünschnabel
Hallo, ich bin ein relativer Anfänger Programmierung betrifft. C ist meine erste Programmiersprache und in dieser versuche ich gerade ein Level-Editor für ein eigenes Spiel zu programmieren (in der konsole). Ich bin soweit fertig, bis auf den Fehler beim laden eines Levels (einlesen eines 2D char arrays aus einer Text datei). Das 2D Array, bzw. die Ausgabe sieht nach dem Laden anders aus als beim Speichern.

In der Anlage sind ein paar screenshots, bei "konsole1" sieht man das Feld vor dem Speichern, bei "datei" die Textdatei nach dem Speichern und bei "konsole2" das Feld nach dem einlesen. Das Feld ist langgezogen und mein "cursor", im Bild das X, springt dadurch auf der Y-Achse auch weiter als auf der X-Achse.

Ich habe die Vermutung das in der Datei möglicherweise ein Zeilenumbruch immer jeweils zu viel gespeichert wird.

Hier der Code wo das Feld gespeichert wird:
datei_wp = fopen(pfad_komplett,"w");

if(datei_wp==NULL)
{
printf("Fehler beim Erstellen, überprüfen Sie den Pfad!\n");​
}
fputs(inhalt, datei_wp); // speichert einige zahlenwerte
for(int j=0;j<length+1;j++) //speichert feld
{
for(int i=0;i<width+1;i++)
{
fprintf(datei_wp,"%c", level[ j ][ i ]);​
}
fprintf(datei_wp,"\n");​
}
fclose(datei_wp);

Hier wird das Feld aus einer Datei eingelesen:
if (zeilen_ueberspringen>0){
for(int i=0;i<zeilen_ueberspringen;i++){
fscanf(datei_rp,"%s",muell);
}​
}
for(int j=0;j<=length;j++)
{
for (int i=0; i<=width;i++)
{
fscanf(datei_rp,"%c",&level[ j] [ i ]);​
}​
}

Hier wird das Feld in der Konsole ausgegeben:
for(int j=0;j<=length;j++)
{
for (int i=0; i<=width;i++)
{
printf("%c ", Feld[ j][ i]);​
}
printf("\n");​
}

Ich würde mich über ein Tipp sehr freuen.
 

Anhänge

  • konsole1.jpg
    konsole1.jpg
    15,4 KB · Aufrufe: 23
  • datei.jpg
    datei.jpg
    16,3 KB · Aufrufe: 24
  • konsole2.png
    konsole2.png
    3,8 KB · Aufrufe: 23
Hallo,

Beim Ausgeben schreibst du nach der inneren Schleife printf ("\n");. Das ist aber nicht nötig, da auch der Zeilenumbruch in der Textdatei und somit auch im Array gespeichert wird. Du gibst jetzt 2-Mal einen Zeilenumbruch aus: Einmal wird der aus dem Array ausgegeben und das zweite Mal mit dem printf() nach der inneren Schleife. Lass einfach das printf() nach der inneren Schleife weg und es funktioniert.

Lg
 
Danke, ich habe außerdem noch gemerkt, dass es klüger war die Zeilenumbrüche schon bei der Initialisierung im Array zu speichern, als erst in der fprintf Funktion. Denn sonst würde der bei jedem Speichern und Laden immer mehr Zeilenumbrüche setzen und so das Spielfeld kaputt machen. Jetzt habe ich aber das Problem das das Array in der Konsole nicht ganz richtig angezeigt wird. Die obere 'O' Reihe, die als Begrenzung des Feldes dient ist leicht verschoben, während alle anderen Reihen passen. In der Textdatei wird aber alles richtig gespeichert, da ist die obere Reihe nicht verschoben. Woran könnte das liegen?

Hier wird bei mir das Feld initialisiert:

Code:
for(int j=0;j<=50;j++)
    {
        for (int i=0; i<=80;i++)
        {
            Feld[j][i]= ' ';
        }
    }
    //Die 4 Ränder werden mit 'O' gefüllt
    for (int i=0; i<=width;i++)
        {
            Feld[0][i]= 'O';
        }
    for (int i=0; i<=width;i++)
        {
            Feld[length][i]= 'O';
        }]
    for (int i=0; i<=length;i++)
        {
            Feld[i][0]= 'O';
        }
    for (int i=0; i<=length;i++)
        {
            Feld[i][width]= 'O';
            
        }
    for (int i=0; i<=length-1;i++)
        {
            Feld[i][width+1]='\n';
        }
Die veränderte Ausgabe:

Code:
for(int j=0;j<=length;j++)
{
for (int i=0; i<=width+1;i++)
{ 
printf("%c ", Feld[j][i]);
}
}
 

Anhänge

  • konsole3.png
    konsole3.png
    3,2 KB · Aufrufe: 16
Zuletzt bearbeitet von einem Moderator:
Moin,

hab's jetzt nur überflogen, aber müsste
C++:
for (int i=0; i<=80;i++)
{
Feld
= ' ';
}

nicht SO lauten?
C++:
for( int i=0; i<=80; i++ )
{
    Feld[i] = ' ';
}

Gruß Klaus
 
Hallo,

so rein aus dem Kopf:
C++:
char Feld[25][80];
int xpos = 0;
int ypos = 0;

// init:
while (ypos < 25)
{
    for (xpos = 0; xpos < 80; xpos++)
    Feld[ypos][xpos] = (char) 0x32;

    if (xpos == 79)  {
        xpos = 0;
        ypos++;
    }
}

for (ypos = 0; ypos < 25; ypos++)
{
    Feld[ypos][0] = 'O';  // linker Rand
    Feld[ypos][79] = 'O';  // rechter Rand
}

for (xpos = 0; xpos < 80; xpos++)
{
    Feld[0 ][xpos] = 'O';  // oben
    Feld[24][xpos] = 'O';  // unten
}
 
Zuletzt bearbeitet von einem Moderator:
Zurück