Dieser Code
fwrite(fileName, sizeof(char), sizeof(boardState->board.theBoard), file);
bedeutet:
schreiben Daten in die Datei file
. Die Daten befinden sich am Speicherort fileName
Punkte, die Daten bestehen aus sizeof(boardState->board.theBoard)
Artikel und jeder einzelne Artikel ist sizeof(char)
Bytes groß.
Klingt das richtig für Sie? Ich denke nicht; Es ist schon falsch, dass die Daten an der Position fileName
Punkte gefunden werden können, da Sie die Board-Daten in die Datei und nicht den Dateinamen schreiben wollen, oder?
Auch vorsichtig sein mit sizeof()
; sizeof()
kann den Inhalt einiger Speicher nicht dynamisch ermitteln, er kennt nur die Größe des statischen Speichers. Z.B.
char test[20];
size_t s = sizeof(test);
s
wird 20 sein.Aber jetzt diese betrachten:
char test[20];
char * ptr = test;
size_t s = sizeof(ptr);
Jetzt s
4 sein wird oder 8 als Zeiger in der Regel 4 Bytes groß oder 8 Byte groß sind. sizeof()
gibt Ihnen hier die Größe des Zeigers, nicht die Größe des Speichers, auf den der Zeiger zeigt. Es gibt in C keine Möglichkeit, die Größe eines Speicherblocks zu erhalten, auf den ein Zeiger zeigt, diese Größe muss immer bekannt sein.
Sie sagen, Ihr Board ist char ** theBoard
, also ist das Board ein Zeiger auf ein Array von Zeigern auf Speicher oder Zeichen.
theBoard -> [0] -> ['a1', 'b1', 'c1', 'd1', ... ]
[1] -> ['a2', 'b2', 'c2', 'd2', ... ]
[2] -> ['a3', 'b3', 'c3', 'd3', ... ]
:
In diesem Fall wird die Code-Erzeugung müßte so aussehen (unter der Annahme, dass die [0], [1], ... sind die Zeilen):
theBoard = calloc(numberOfRows, sizeof(char *));
for (size_t i = 0; i < numberOfRows; i++) {
theBoard[i] = calloc(numberOfCols, sizeof(char));
}
Wenn das der Fall ist , müssen Sie Ihre Daten Zeile für Zeile schreiben:
for (size_t row = 0; row < numberOfRows; row++) {
fwrite(boardState->board.theBoard[row], sizeof(char), numberOfCols, file);
}
natürlich unter der Annahme, dass alle Zeilen eine gleiche Anzahl von Spalten haben müssen.
Wenn ich Ihnen einen Tipp geben kann, machen Sie nicht die Platine char **
, machen Sie es einfach char *
, wie es alles so viel einfacher macht. Sehen Sie, wenn Ihr Board 20x30 (20 Zeilen, 30 Spalten), dann können Sie Ihr Board wie folgt definieren:
char * theBoard = calloc(numberOfRows * numberOfCols, sizeof(char))
Jetzt haben Sie nur ein einzelnes Array, wie folgt aus:
theBoard -> ['a1', 'b1', 'c1', 'd1', ... ,
'a2', 'b2', 'c2', 'd2', ... ,
'a3', 'b3', 'c3', 'd3', ... ,
:
]
Wie Würden Sie auf ein bestimmtes Feld zugreifen? Ganz einfach:
int row = 5;
int col = 8;
char field = theBoard[(row * numberOfCols) + col];
Und dann können Sie das gesamte Brett in einem Aufruf schreiben:
fwrite(theBoard, sizeof(char), numberOfRows * numberOfCols, file);
See, viel einfacher. Sie können auch nur das gesamte Board befreien free(theBoard);
durch den Aufruf während bei den char **
Ansatz verwenden, müssen Sie dies tun, statt:
for (size_t i = 0; i < numberOfRows; i++) {
free(theBoard[i]);
}
free(theBoard);
Welche Fehler? Wenn es nicht korrekt gespeichert wird, liegt das daran, dass 'sizeof' ein' char ** '4 oder 8 (oder so ähnlich) ist. Sie sollten die Anzahl der Zeichenzellen berechnen, die direkt gespeichert oder geladen werden sollen: 'boardState-> board.numRows * boardState-> board.numCols'. –
'char * Dateiname = NULL; scanf ("% s", Dateiname); '- Sie haben keinen Speicher für den' fileName' zugewiesen .... Beachten Sie auch, dass die '% s' Direktive _automatisch_ über führende Whitespaces überspringt, so dass das führende Leerzeichen nicht benötigt wird die Formatzeichenfolge. –
Hängt davon ab, was "BoardState" ist. Aber 'fwrite (fileName, sizeof (char), sizeof (boardState-> board.theBoard), file);' sieht sowieso total falsch aus. Meinten Sie 'fwrite (boardState, sizeof (char), sizeof (boardState-> board.theBoard), Datei);'? –