|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Flow Junior JLI'ler
Alter: 42 Anmeldedatum: 13.09.2005 Beiträge: 57
Medaillen: Keine
|
Verfasst am: 29.10.2005, 12:55 Titel: Problem mit fread und fwrite |
|
|
Hallo,
ich bin dabei eine Highscoreklasse zu schreiben. Realisiert soll das ganze werden, indem ein Array mit 10 Elementen auf eine Struktur erzeugt wird. Beim ersten Durchlauf werden zu Testzwecken erstmal alle 10 Strukturen mit Standardwerten gefüllt und in die Datei Highscore.txt geschrieben.
CPP: | #include "Highscore.h"
#include "Font.h"
#include "Spaceball.h"
typedef struct HighscoreList // Legt eine Struktur für die 10 Plätze an
{
char name[8];
int punkte;
int level;
}SCORE;
// ***************************************************************************************
// Funktionen
// ***************************************************************************************
void Highscore::EntryHighscore()
{
SCORE Score[10]; // legt einen Array mit 10 Elementen an
Datei = fopen("Highscore.txt", "wb"); // Highscoredatei öffnen
int points = 0;
for(int i = 0; i < 10; i++)
{
strcpy(Score[i].name, "Player");
Score[i].punkte = points++;
Score[i].level = 3;
fwrite(&Score, sizeof(SCORE), 1, Datei);
}
fclose(Datei);
}
void Highscore::LoadHighscore(void)
{
InitFont(); // Schriftart initialisieren
Sterne = new CStars(200); // Sternenfeld für den Hintergrund anlegen
lpDDBlack = DrawBitmap("media\\black.bmp",0,0); // schwarzen Hintergrund für die Sterne laden
BlackRect = RectFill(0,0, 480, 465); // RECT für den schwarzen Hintergrund
Datei = fopen("Highscore.txt", "rb"); // Highscoredatei öffnen
}
// Stellt die Highscoreliste auf dem Bildschirm dar
void Highscore::DrawHighscore(void)
{
SCORE Score[10]; // legt einen Array mit 10 Elementen an
// Gibt den Highscore aus
// Hintergrund rendern
Render(lpDDBlack, BlackRect, BlackRect,4);
Sterne->Draw(GetBackBuffer());
char* cText = new char[];
RECT TitleDestRect = RectFill(20,133,32,32);
cText = "*** HIGHSCORE ***";
BitmapText(cText, TitleDestRect, 'b');
PlatzRect = RectFill(55,30,32,32); // Rect für den Platz
NameRect = RectFill(55,80,32,32); // Rect für den Namen
PunkteRect = RectFill(55,388,32,32); // Rect für die Punkte
LevelRect = RectFill(55,520,32,32); // Rect für den Level
// Zeichnet die Überschrift
cText = "#";
BitmapText(cText, PlatzRect, 'b');
cText = "Name";
BitmapText(cText, NameRect, 'b');
cText = "Punkte";
BitmapText(cText, PunkteRect, 'b');
cText = "Level";
BitmapText(cText, LevelRect, 'b');
// Aus der Datei lesen
for(int i = 0; i < 10; i++)
{
fread(&Score[i], sizeof(Score[i]), 1, Datei);
PlatzRect.bottom += 32;
PlatzRect.top += 32;
char cPlatzZahl[10];
int platz = i;
itoa(++platz, cPlatzZahl, 10);
if(platz >= 10) // Damit die 10 an der gleichen Stelle beginnt, wie die Einstelligen Zahlen
{
PlatzRect.left -= 22;
PlatzRect.right -= 22;
}
BitmapText(cPlatzZahl, PlatzRect, 'g');
NameRect.bottom += 32;
NameRect.top += 32;
char* cName = new char[];
cName = Score[i].name;
BitmapText(cName, NameRect, 'g');
PunkteRect.bottom += 32;
PunkteRect.top += 32;
char punkteZahl[4];
itoa(Score[i].punkte, punkteZahl, 10);
BitmapText(punkteZahl, PunkteRect, 'g');
LevelRect.bottom += 32;
LevelRect.top += 32;
char cLevelZahl[2];
itoa(Score[i].level, cLevelZahl, 10);
BitmapText(cLevelZahl, LevelRect, 'g');
}
Flip();
fclose(Datei);
} |
Das Problem ist nun die Ausgabe. Ich übergebe die Daten aus der Struktur, die in der Datei sind an meine Font-Funktion (BitmapText()), die nur char-Arrays als Parameter übernimmt. Daher werden die Zahlen zuvor mit itoa() in Strings konvertiert und anschliessend an die Funktion übergeben, die sie auch gleich ausgibt.
Soweit, so gut. Das erste Bild bleibt aber immer gleich stehen, weil er einen Fehler ausgibt. Scheinbar würde die Funktion ausserhalb des Bildschirm-Bereichs blitten wollen. Da darf er aber eigentlich nicht hinkommen. Denn die Zahlen sind ja Einstellig.
Dann habe ich einmal die RECTs (von Level und Punkte) für die Ausgabe Probeweise ganz nach links verschoben. Dann werden plötzlich endlos lange Zahlen dargestellt, die aber gar nicht in der Datei sein dürften. Manchmal ( das hängt von der Position der RECTs ab und davon, welche Daten in die Datei gespeichert wurden) zeigt er sogar binär Darstellung an (0011001), manchmal auch völlig unlogische Zahlenkombinationen. Häufig die Zahl (-858993460) Dabei dürfte es nur eine Einstellige Zahl sein. Wenn diese Zahl ganz zu sehen ist, dann zeigt er den Namen nicht mehr an.
Meine Vermutung ist jetzt, dass er wohl nur im ersten Durchlauf die Daten anzeigt, aber danach die Werte scheinbar allesamt leer sind. Wie kann das sein?
Ich habe die Ausgabe einmal mit einer ganz normalen Struktur, die nicht aus der Datei ausgelesen wird, aber exakt die gleichen Inhalte hat probeweise ausgegeben und alles funktioniert bestens.
Ich hoffe ihr könnt mir helfen, habe jetzt nahezu nonstop die ganze Nacht durch und den abend 19 Stunden sämtliche Topics hier, in anderen Foren dutzende Tutorials gelesen, rumprobiert und resigniert und komme einfach nicht darauf, woran es legen könnte.
Danke Flo |
|
Nach oben |
|
|
Flow Junior JLI'ler
Alter: 42 Anmeldedatum: 13.09.2005 Beiträge: 57
Medaillen: Keine
|
Verfasst am: 29.10.2005, 14:01 Titel: |
|
|
Das ist jetzt schon das zweite Mal, dass ich Stundenlang nach Antworten suche, dann hier in aller Ruhe mein Problem schildere und meinen Thread lese und selbst auf eine Antwort komme.
Es klappt jetzt. Ihr könnt den Thread wieder schliessen. Sorry |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 29.10.2005, 14:53 Titel: |
|
|
Verrätst du uns auch, woran es gelegen hat. Kann ja sein, dass jemand anderes ein ähnliches/dasselbe Problem hat _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Flow Junior JLI'ler
Alter: 42 Anmeldedatum: 13.09.2005 Beiträge: 57
Medaillen: Keine
|
Verfasst am: 29.10.2005, 15:41 Titel: |
|
|
Ja daran hatte ich auch schon gedacht.
Was wirklich das Problem war, habe ich nicht entdeckt, jedoch habe ich anstatt bei jedem Durchlauf die Datei zu öffnen, die daten auszulesen und sie wieder zu schliessen einfach bei LoadHighscore();, das vorbereitende Arbeiten leistet die Werte aus der Datei einmal ausgelesen (spart sowieso Rechenzeit) und gebe die Werte dann ganz normal aus. So funktioniert es.
Ich habe mich dazu entschlossen, da ja scheinbar bei jedem 1. Durchlauf die Daten richtig gelesen wurden, bei weiteren Durchläufen nicht.
Ich Ochse!!!
Jetzt wo ich das hier schreibe seh ich das Problem!!!
Ich hab LoadHighscore() nur einmal ausgeführt. Dort wird die Datei geöffnet. in DrawHighscore werden die Daten eingelesen und die Datei wieder geschlossen. Beim nächsten Aufruf von DrawHighscore bleibt die Datei aber geschlossen, da LoadHighscore, wo die Datei geöffnet wird nur einmal geladen wird.
Wie kann mir nur so etwas Dummes passieren. |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 30.10.2005, 01:49 Titel: |
|
|
Flow hat Folgendes geschrieben: | Wie kann mir nur so etwas Dummes passieren. |
Nächstes mal:
CPP: | if(!file) Error("Datei konnte nicht geöffnet werden/ist noch geschlossen"); |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
Flow Junior JLI'ler
Alter: 42 Anmeldedatum: 13.09.2005 Beiträge: 57
Medaillen: Keine
|
Verfasst am: 30.10.2005, 19:50 Titel: |
|
|
Danke für den Tipp. Wenn ich das eingebaut hätte, wäre ich wohl um einige Stunden früher auf die Lösung gekommen. Das war mir eine Lektion fürs Leben |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|