Fehler bei Speicher/ Lesefunktion



  • #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    #include "conwnd.c"
    #include "conioex.h"
    #include <wincon.h>
    #include <string>
    #include <iomanip>
    #include <vector>
    #include <fstream>
    
    using namespace std;  
    
    struct Daten
    {
           string Name;
           int Staffelnummer;
           float Schwimmzeit;
           float Radzeit;
           float Laufzeit;
           int Geschlecht;
           float Ergebnisse;
    };
    
    Daten feld[10];
    
    void speichern()
    {
    
         ofstream dat_aus;
         dateiname = "konfig.ini";
         dat_aus.open(dateiname.c_str(), ios_base::out);
         dat_aus << feld << endl;
    
         dat_aus << feld[0].Name;
         dat_aus << feld[1].Name;
    
         dat_aus.close();
    
    }
    
    void lesen()
    {
         ifstream dat_ein;
         dateiname = "konfig.ini";
         dat_ein.open(dateiname.c_str(), ios_base::in);
    
         char zeichen;
         while (!dat_ein.eof())
         {
           dat_ein.get(zeichen);
           cout << zeichen;
         }
        system("PAUSE");
        dat_ein.close();
    }
    

    Toll schaut man sich nun die "ini" an sieht man (wenn man a(1 teilnehmer und b fürn 2 teilnehmer) in der ini ab ,...und das hier

    0x449010

    eine Adresse und was gibt er mir aus,.nur die adresse,...



  • Bei mir gibt er die Addresse und abb aus.

    Wobei das bb am ![irgenwas].eof() liegt.

    Grüße



  • Ja, ein Array kann implizit in einen (konstanten) Zeiger umgewandelt werden - und witzigerweise sind die IOStreams in der Lage, beliebige Zeiger auszugeben. (und da es keinen passenden Ausgabeoperator für 'Daten*' oder 'Daten[]' gibt, nimmt der Compiler das nächstliegende - und das ist der op<< für 'void*')

    Wenn du die Inhalt des Arrays ausgeben willst, mußt du dir eine Schleife bauen:

    for(int i=0;i<10;++i)
      dat_aus<<Daten[i].Name<<' '<<Daten[i].Staffelnummer<<...<<endl;
    

    (die Leerzeichen dazwischen sind nötig, wenn du die Werte später wieder trennen willst)

    PS: Ich bin immer noch der Meinung, du solltest die Adresse und Größe des zu lesenden/schreibenden Arrays als Parameter übergeben.



  • Naja wieso Parameter abgeben, wenn das Feld mit einmal gezogen werden soll,..

    void lesen()
    {
         ifstream dat_ein;
         dateiname = "konfig.ini";
    
         dat_ein.open(dateiname.c_str(), ios_base::in);
    
         char zeichen;
    
         for(int i=0;i<10;++i)
         {  
           dat_ein.get(zeichen);
           zeichen << feld[i].Name << endl;      
         }
    
        system("PAUSE");
        dat_ein.close(); 
    }
    

    178 C:\Dokumente und Einstellungen\USER\Desktop\Triathlon1.1\main.cpp no match for 'operator<<' in 'zeichen << feld[i].Daten::Name'

    Kann mir vielleicht jemand sagen was das bdeutet?
    bzw, ist ja nett wen ihr mir hilft,.aber könnt ihr es bitte vorher testen?

    zudem mit meiner 1. Funktion (seite 1) er speichert ja,..nur das lesen immer ,..zudem wenn ich in der speicherfunktion dann die lesefunktion reinscripte liest er auch,.ich glaube es hat was mit dem Programm zu tuen,.das sich etwas verharckt oder so 😞



  • Svolf schrieb:

    Naja wieso Parameter abgeben, wenn das Feld mit einmal gezogen werden soll,..

    Ganz einfach - mit Parametern bist du flexibler 😉

    zeichen << feld[i].Name << endl;
    

    178 C:\Dokumente und Einstellungen\USER\Desktop\Triathlon1.1\main.cpp no match for 'operator<<' in 'zeichen << feld[i].Daten::Name'

    Kann mir vielleicht jemand sagen was das bdeutet?
    bzw, ist ja nett wen ihr mir hilft,.aber könnt ihr es bitte vorher testen?

    Ganz einfach - die angegebene Anweisung ist Käse - versuch's mal mit feld[i].Name += zeichen (oder noch einfacher - lies den Namen per dat_ein>>feld[i].Name; ein ;)).

    zudem mit meiner 1. Funktion (seite 1) er speichert ja,..nur das lesen immer ,..zudem wenn ich in der speicherfunktion dann die lesefunktion reinscripte liest er auch,.ich glaube es hat was mit dem Programm zu tuen,.das sich etwas verharckt oder so 😞

    Dein Problem ist, daß er eben nicht das speichert, was er speichern soll.

    std::string hat intern nur einen char* und einige Hilfsvariablen (für Größe und Kapazität) und verwaltet seine Zeichen in einem externen Speicherblock, den er per new[] angefordert hat. Wenn du den mit write() schreibst, erfasst du nur die internen Daten - und beim zum nächsten Leseversuch erhältst du den Zeiger auf die Position, wo deine Zeichendaten mal waren.
    (das erinnert mich an die Schildbürger - die haben eine Kerbe in ihr Boot geritzt, um ihren im See versenkten Schatz wiederzufinden :D)

    Edit: Aber ich glaube, das habe ich schonmal ganz am Anfang versucht, dir zu erklären.



  • HI,...

    ich schaff es einfach nicht. Ich sage es mal so, dass Programm läuft so ziemlich gut (außer kleine Bugs durch falsche Eingaben). Denn dieses Triathlonprogramm ist in kleines Projekt was ich zu meiner Ausbildung (2. Semester) machen soll.
    Es funktioniert nur nicht die Speicher/ lesefunktion,..
    Ich habe das Programm (mit headers etc..) hochgeladen,..und würde mich freuen, wenn jemand Zeit hätte sich das mal anzusehen,...
    Es wäre echt nett, denn ich habe schon so viel versucht und in büchern/ forums gelesen,.ich bin da jetzt ratlos,.und ich weiß ihr habt da schon mehr ahnung davon,..dass mir jemand halt helfen kann ,..

    Link!
    http://dateihoster.de/preview.php?file=0c1d5d5ab4b9060441ce0cbc1.rar

    Ich würde mich freuen 😉

    mfg

    Svolf



  • Ich könnte dir jetzt gerne nochmal alles vorbeten, was ich schon mehrfach erklärt habe, aber das erspare ich mir jetzt. Kauf dir lieber ein vernünfitges Buch, um die Grundlagen von C++ zu verstehen. (und lern lesen 😉 - etwas, was ich von einem Studenten im zweitens Semester eigentlich erwarten würde)


Anmelden zum Antworten