JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=953f8d2db0d257d1a76384f1e63c3b2eMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem mit fread und fwrite

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Flow
Junior JLI'ler


Alter: 42
Anmeldedatum: 13.09.2005
Beiträge: 57

Medaillen: Keine

BeitragVerfasst am: 29.10.2005, 12:55    Titel: Problem mit fread und fwrite Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Flow
Junior JLI'ler


Alter: 42
Anmeldedatum: 13.09.2005
Beiträge: 57

Medaillen: Keine

BeitragVerfasst am: 29.10.2005, 14:01    Titel: Antworten mit Zitat

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 Smile Rolling Eyes
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 29.10.2005, 14:53    Titel: Antworten mit Zitat

Verrätst du uns auch, woran es gelegen hat. Kann ja sein, dass jemand anderes ein ähnliches/dasselbe Problem hat Wink
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Flow
Junior JLI'ler


Alter: 42
Anmeldedatum: 13.09.2005
Beiträge: 57

Medaillen: Keine

BeitragVerfasst am: 29.10.2005, 15:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 30.10.2005, 01:49    Titel: Antworten mit Zitat

Flow hat Folgendes geschrieben:
Wie kann mir nur so etwas Dummes passieren.

Nächstes mal: Wink
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Flow
Junior JLI'ler


Alter: 42
Anmeldedatum: 13.09.2005
Beiträge: 57

Medaillen: Keine

BeitragVerfasst am: 30.10.2005, 19:50    Titel: Antworten mit Zitat

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 Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum