Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » struct in eine Datei schreiben lassen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.10.2006, 08:30 Uhr
Mindgames



Hallo zusammen...

Ich schreib gerade zur Übung ein kleines Programm das die Chipverteilung beim Pokerspiel ausgibt. Funktioniert auch soweit. Nun möchte ich eine "feste" config einbinden damit man nicht immer gezwungen ist alle Werte neu einzutippen.

Ich bekomme nun nach langem hin und her-probieren keinen Fehler mehr beim compilen, aber dafür steht nur ramsch (irgendwelche chars mit @ hinten dran) im textfile.

Schätze ich muss noch die Werte umwandeln, aber ich komm nicht weiter


C++:

#include <iostream>
#include <string>
#include <string.h>
#include<iostream>
#include<fstream>
#include<iomanip>
#include <io.h>
#include <cfloat>
#include <system.hpp>
#include <cmath>

/*
    Poker Blind Calculator by Florian Lüttgens
                   (c) 2006
*/


using namespace std;
const char version[6] = "0.1b";

struct daten {
       double chiptypes2, howmuchchips2, playerscount2, chipsperplayer2, semihighchip2, highchip2;
           };
daten m00;

daten getconfig(){
    daten m01;
    double chiptypes, howmuchchips, playerscount, chipsperplayer, semihighchip, highchip;
    cout << "Wieviele verschiedene Chip-Sorten gibt es? ";
    cin >> chiptypes;
    cout << endl;
    cout << "Wieviele Chips pro Sorte? ";
    cin >> howmuchchips;
    cout << endl;
    cout << "Wieviele Leute wollen mitzocken? ";
    cin >> playerscount;
    cout << endl;
    chipsperplayer = (chiptypes * howmuchchips) / playerscount;
    semihighchip = (chipsperplayer / 100) * 60;
    highchip = (chipsperplayer / 100) * 30;
    m01.chiptypes2 = chiptypes;
    m01.howmuchchips2 = howmuchchips;
    m01.playerscount2 = playerscount;
    m01.chipsperplayer2 = chipsperplayer;
    m01.semihighchip2 = semihighchip;
    m01.highchip2 = highchip;
    return m01;
}

void saveconfig (daten m000) {
     FILE* datei;
     system ("del poker.cfg");
     datei = fopen("poker.cfg", "a");
     fwrite (&m000,sizeof(m000),1,datei);
     fclose (datei);
}

int main(int argc, char* argv[]){
    int hauptmenue;
    cout << endl << "  Willkommen beim Pokertool " << version; cout << endl; cout << "----------------------------------" << endl;
    cout << "Was moechten Sie tun?" << endl << endl;
    cout << "   [1] Chips pro Spieler ausgeben" << endl;
    cout << "   [2] Gewinn berechnen" << endl;
    cout << "   [3] Config" << endl;
    cout << "   [4] Programm verlassen" << endl << endl;
    cout << "Bitte Ziffer eingeben: ";
    cin >> hauptmenue;
    cout << endl << endl;
    switch (hauptmenue) {
           case 1:{
                double chiptypes, howmuchchips, playerscount, chipsperplayer, semihighchip, highchip;
                cout << "Wieviele verschiedene Chip-Sorten gibt es? ";
                cin >> chiptypes;
                cout << endl;
                cout << "Wieviele Chips gibt es pro Sorte? ";
                cin >> howmuchchips;
                cout << endl;
                cout << "Wieviele Leute wollen mitspielen? ";
                cin >> playerscount;
                cout << endl;
                chipsperplayer = (chiptypes * howmuchchips) / playerscount;
                semihighchip = (chipsperplayer / 100) * 60;
                highchip = (chipsperplayer / 100) * 30;
                cout << "Jeder Spieler erhaelt " << chipsperplayer; cout << " Chips" << endl;
                cout << "Jeder Spieler erhaelt " << semihighchip; cout << " Chips der vorletzten Wertigkeit" << endl;
                cout << "Jeder Spieler erhaelt " << highchip; cout << " Chips der hoechsten Wertigkeit" << endl;
                }
                break;
           case 2: {
                double buyin, players, player1gewinn, player2gewinn, player3gewinn, platz1prozent, platz2prozent, platz3prozent, gesamtprozent;
                cout << "Wieviele Spieler?" << endl;
                cin >> players;
                cout << "Wie hoch ist der Buy-In?" << endl;
                cin >> buyin;
                cout << "Wieviel Prozent erhaelt Platz 1:  ";
                cin >> platz1prozent;
                cout << "Wieviel Prozent erhaelt Platz 2:  ";
                cin >> platz2prozent;
                cout << "Wieviel Prozent erhaelt Platz 3:  ";
                cin >> platz3prozent;
                cout << "---" << endl;
                gesamtprozent = (platz1prozent + platz2prozent + platz3prozent);
                if (gesamtprozent != 100) {
                   cout << "Prozentzahl muss 100 ergeben, nicht " << gesamtprozent << endl;
                   system ("pause");
                   return 0;
                }
                player1gewinn = ((buyin * players) / 100) * platz1prozent;
                player2gewinn = ((buyin * players) / 100) * platz2prozent;
                player3gewinn = ((buyin * players) / 100) * platz3prozent;
                cout << "Platz 1 = " << player1gewinn;  cout << " Euro" << endl;
                cout << "Platz 2 = " << player2gewinn;  cout << " Euro" << endl;
                cout << "Platz 3 = " << player3gewinn;  cout << " Euro" << endl;
                }
                break;
           case 3:{
                m00 = getconfig();
                saveconfig(m00);
                cout << "Daten wurden geschrieben\n" << endl << endl;
                }
                break;
           case 4:{
                cout << "Danke das Sie Pokertool " << version; cout << " benutzt haben!" << endl;
                cout << "   (c) Florian Lüttgens <2006>" << endl;
                }
                break;
           default:
                cout << "Fehlerhafte eingabe!" << endl;
                return 1;
    }
    system ("pause");
    return 0;
}


Bin mir auch im klaren das einiges bestimmt einfacher/besser gemacht werden kann, aber ich bring mir das gerad selbst bei und das ist halt mein erstes "richtiges" programm

Danke schonmal im vorraus!
-Mindgames
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.10.2006, 10:00 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Kommt drauf an was du willst. Im Moment steht da kein Ramsch drin sondern einfach deine Struktur so wie sie ist und wenn du sie genauso wieder einlesen würdest hättest du sie auch wieder die richtigen Werte in deiner Struktur stehen.

Wenn du die Datei manuell bearbeiten können willst dann musst du die Werte da einzeln reinschreiben z.B. mit fprintf.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.10.2006, 11:12 Uhr
Mindgames



ah, das heisst wenn ich die datei wieder genau so einlese erhalte ich mein struct zurück? Das wär schon okay so, denn eigendlich ist das anpassen per hand nicht wirklich nötig...

danke dir, ich probier mal weiter...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.10.2006, 11:39 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Ansonsten kannst du dir mal ansehen, wie man in C++ Objekte serialisiert, das ist genau das, was du machen willst.
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.10.2006, 13:26 Uhr
ao

(Operator)



Zitat von Mindgames:
ah, das heisst wenn ich die datei wieder genau so einlese erhalte ich mein struct zurück? Das wär schon okay so, denn eigendlich ist das anpassen per hand nicht wirklich nötig...

danke dir, ich probier mal weiter...

Die binäre Speicherung (das, was du da machst) hat ein paar Vorteile (schnell hingeschrieben und schnell in der Ausführung), aber auch wesentliche Nachteile. In deinem Anfängerstadium sieht man die nur noch nicht.

Sie ist nicht kompatibel zu anderer Hardware, anderen Betriebssystemen, anderen Compilern, zu anderen Versionen desselben Compilers, ja sogar zu exakt demselben Compiler, wenn er mit anderen Einstellungen (struct alignment) betrieben wird. Nicht kompatibel heißt nicht, dass es in jedem Fall Probleme geben muss, aber es heißt, dass es unerwartet Probleme geben kann, wenn man irgendeine Komponente austauscht oder Einstellungen ändert.

Sie ist vor allem nicht kompatibel zu anderen Versionen deines Quellcodes. Wenn du die Datenstruktur irgendwann um neue Felder erweiterst oder den Datentyp bestehender Felder änderst, werden alle alten Config-Files unbrauchbar. Es sei denn, du baust eine Kompatibilitätsschicht ein, die die alten Files noch lesen und uminterpretieren kann. Dazu müssen sie aber als "alte Files" erkennbar sein, d.h. eine Versionierung der Struktur muss unbedingt her.

Ich würde dringend raten, solche Daten in lesbarer Textform abzulegen, dann sind sie portabel und erweiterbar und notfalls im ASCII-Editor oder skriptgesteuert reparierbar. Das Wegschreiben und Wiedereinlesen macht zwar etwas mehr Arbeit, aber die hat man nur ein einziges Mal und ist danach alle grundsätzlichen Probleme los. Und man lernt noch was dabei.

Man macht das mit den Operatoren << (Wegschreiben) und >> (Einlesen), zu finden in iostream.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.10.2006, 13:39 Uhr
Mindgames



ja, ich hab wohl einfach vercheckt das ich binary genommen hatte, das dann nur irgendwelche chars mi file stehn ist ja dann logisch :-&

Ich werd das dann wohl umstellen wenn ihr meint das das besser ist... Ansich ist eine kompatibilität nebensächlich, aber gut zu wissen

bis denne...

-Mindgames
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.10.2006, 17:28 Uhr
~joggl
Gast


Hi, ich weis nicht, ich hatte leider nicht zeit alles durchzulesen, ich habe aber mal in der Arbeit eine Struktur speichern müssen in c++, das ging mit "WritePrivateProfileStruct", wobei du beachten musst, dass das nur mit strings geht, du also vorher die integer werte noch in eine string variable schreiben musst, mit "sprintf", würde dir gern ne musterlösung mit einer gds structur geben, dass verstößt aber gegen den datenschutz, da das programm für die Firma ist.
Hoffe ich konnte dir helfen bei fragen kannst du mich gerne anschreiben
hier klicken
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.11.2006, 11:07 Uhr
Mindgames



Hallo nochmal, mein programm funktioniert jetzt schon ganz gut, ich hab sogar ne funktion zur speicherung der einstellungen eingebaut

Ansich kein fehler, aber jetzt würde ich gern double-fliesskommazahlen in ganzzahlen umwandeln, bzw auf 2 kommastellen begrenzen, meien compilerhilfe zeigt mir format() an, ich kanns irgendwie nicht richtig nutzen, hat da mal jemand nen 2-zeiler für mich?

thx und schönen montag noch
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.11.2006, 13:00 Uhr
Mindgames



hat sich erledigt, funktioniert alles

der nächste schritt ist umstellung auf windows GUI, da werd ich sicher noch fragen haben
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: