pointer von struct array übergeben

Hi.
Leider ist so einiges schief an Deinem Projekt und das beginnt schon in main(...)

Code:
 int main(int argc, char* argv[]) {
      row *r;
      s_fill(&r);
Hier wird ein Zeiger auf eine Variable r vereinbart, aber kein Speicher alloziiert.
Quasi eine fiktive Adresse mit Daten. Dieser Pointer ist ungultig.
Ja. Aber deswegen wird ja auch die Adresse des Zeigers an die Funktion s_fill übergeben, damit der Zeiger in dieser Funktion initialisiert werden kann.
Selbst wenn Du jetzt Speicher alloziiert hättest geht es dann im Code weiter...

Code:
    //f.seekg(sizeof(int));
    f.read(reinterpret_cast<char*> (&n), sizeof(n));
    cout << n << endl;

    // nach diesem read steht der Dateizeiger falsch!
    // muss! zurückgesetzt werden
    f.seekg( - ( sizeof( n ) ), ios::cur ); //
Du liest von den Daten schon mal einen int Wert aus der Datei ein (hast also eine Seite im Buch aufgeschlagen), gibst die Nummer aus und willst dann von der aktuellen Position ausgehend den kompletten Datensatz einlesen - was auch funktioniert wenn noch weitere Daten verfügbar sind, aber es wird der aktuelle Datensatz und ein Teil vom nächsten Datensatz gelesen! So passt das nicht in Deine Struktur. ;)
Du weißt offensichtlich nicht wie das Format der Datei aufgebaut ist. Die Datei beginnt mit einem int, der angibt wieviel Elemente in der Datei gespeichert sind. Das hatte spammich in einem anderen Thema geschrieben.

Gruß
 
Tja das dort die Anzahl der Element ist erklärt einiges :D.
Okay hab auch noch mal in den Code gesehen.

Stimmt, den Alloc in main kannste weglassen!

Trotzdem - die Adressierung beim Lesen der Daten ist bei Dir falsch.

Gruß René
 
Also ich incrementiere hier mal gar nix ;), ich habe mich auf den Code aus Beitrag #7 bezogen und Fehler, die ich gesehen habe versucht zu beheben. Im besten Fall habe ich den Fehler übersehen und - ich stimme Dir zu - das stimmt sogar!
Der Increment ist auch falsch...


Gruß René
 
Code:
#include <iostream>
#include <fstream>

using namespace std;

struct row {
    unsigned int nr;
    int p;
    float n;
};

void s_fill(row **r) {
    int n;
    row *pr;

    fstream f("daten.dat", ios::in|ios::binary);
    if (!f.good()) {
        cerr << "Cannot open input file." << endl;
        return; //raus hier! weitermachen hat eh keinen sinn...
    }

    //f.seekg(sizeof(int));
    f.read(reinterpret_cast<char*> (&n), sizeof(n)); //gibt die anzahl der eintraege zurück
    cout << n << endl;
    // nach diesem read steht der Dateizeiger falsch!
    // muss! zurückgesetzt werden
    // f.seekg( - ( sizeof( n ) ), ios::cur ); // seek schon richtig, da nun struct los geht


    *r = new row[n]; 
    // hier sollte *r geprüft werden ob Speicher alloziiert werden konnte!
    // ...

    pr = *r;
    for(int i = 0; i < n; i++) {
        if (!f.read(reinterpret_cast<char*> (pr), sizeof(row)))
            cerr << "Cannot read from input file." << endl;
        else
            cout << "Reading values for struct ... OK (" << f.tellg() << ")" << "." << endl;
        pr++; // SPEICHER ZUGRIFFS FEHLER?
    }
    cout << "The end of the file has been reached." << endl;
    f.close();
}

int main(int argc, char* argv[]) {

    row *r; /*
            = new row[100]; // Reservieren wir doch mal ein Objekt...
    if( NULL == r ) {
        cerr << "couldnt reserve memory for data!" << endl;
        return -1;
    }*/

    s_fill(&r);

    cout << r[0].nr << endl;

    // hier fehlen sämtliche delete zum Speicher abräumen...
    system("pause");
    return EXIT_SUCCESS;
}
Hab die Zeigerarithmetik etwas vereinfacht, der Code sollte jetzt zuminest mal durch laufen.
Trotzdem, hier gehört noch ordentlich aufräumen rein... ;)

Gruß
 
Zurück