ich peil garnix ...



  • fstream würde dich nehmen, weil es das Programm konsistenter macht (du nimmst ja auch cout, cin und cerr)

    Ich würde zu Beginn des Programms 2 fstreams (1 für jede Datei) aufmachen und die Daten in einen vector<int> bzw. vector<Artikel> einlesen, während der Laufzeit nur auf diesen vectoren operieren und zum Schluss die Daten wieder speichern (evtl. nur, wenn geändert).



  • die Verwendung ist dann etwa so:

    vector<int> Indices; // schon eingelesen
    sort(indices)
    

    hpus muss weg in einer 3/4stunde wieder da



  • die Verwendung ist dann etwa so:

    vector<int> Indices; // schon eingelesen
    //sort(Indices.begin(), Indices.end()); // sollte schon sortiert sein!
    Artikel& artikel = Primary[Indices[index]];
    

    schau dir mal vielleicht die heap-Funktionen an



  • @KingRuediger ....ich würde zu Beginn des Programms 2 fstreams (1 für jede Datei) aufmachen und die Daten in einen vector<int> bzw. vector<Artikel> einlesen ....
    angenommen es stehen 5 millionen artikel in der Primärdatei mit den Artikeln, da müsste ja dann immer der ganze vector von vorne bis hinten eingelesen werden. Dabei will ich das doch garnicht. Ich möchte einen neuen Artikel einfach nur ans Ende schreiben oder aber über die Indexdatei mittels Offset auf die Primärdatei zugreifen. Auch weiss ich nicht warum ich die Indexdatei in den vector einlesen soll, das wäre ja dann sequentiell was ich ja grade vermeiden möchte, (binär-suche und nicht sequentiell), und zum sortierten einfügen dachte ich die funktion lower_bound(...) aus der bibliothek algorithm würde das machen.

    😉 silke



  • Original erstellt von <KingRuediger>:
    /*iDat ist keine Sequenz! Du musst erst iDat in einen vector<int> einlesen!*/

    das ist doch betrollung. sprachen wir nicht von direktzugriffsdateien?



  • Original erstellt von <KingRuediger>:
    schau dir mal vielleicht die heap-Funktionen an

    ist ja noch schlimmer. nicht auf KingRuediger hören, der bringt dich ab vom weg.





  • Original erstellt von Silke_verzweifelt:
    und zum sortierten einfügen dachte ich die funktion lower_bound(...) aus der bibliothek algorithm würde das machen.

    nee, die macht mit dateien gar nix.

    sortiert einfügen in die index-datei würde ich mit insertion sort machen.
    also etwas so:

    int anzahl=länge von primdatei/sizeof(Datensatz);
    open primdatei for append;
    fseek ans ende;
    write(neuerDatensatz,sizeof(Datensatz));
    close primdatei;
    ip=IndexPair;
    ip.key=neuerDaensatz.artikelnummer;
    ip.zeiger=anzahl;
    
    //puh. neuer datensatz ist in die hauptatei geschrieben. und das entsprechende 
    // paar für den index hab ich schon im ram (namens ip). jetzt ip nich 
    // einsortieren.
    
    open indexdatei for append;
    fseek(ende);
    write ip;
    
    //dangeklatsch ist der neue satz. jetzt sortieren.
    
    int pos=anzahl-1;//pos links vom neuen.
    while(pos>0
    {
       fseek(pos*sizeof(Indexpair));
       read links;
       read rechts;
       if(links.key<=rechts.key) break;//haha, fertig
       fseek(pos*sizeof(IndexPair));
       write rechts;
       write links;
    }
    

    und zum testen und damits überhaoupt was wird, musst du erstmal das suchen in der indexdatei als sequenzielle suche implementieren. binäre suche ist zu schwer. wenn dann alles klappt, kannste dir suche umstricken, ohne am rest des programms was zu ändern.

    [ Dieser Beitrag wurde am 03.05.2003 um 13:32 Uhr von volkard editiert. ]



  • Original erstellt von <d>:
    @volkard: [url=http://www.c-plusplus.net/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=37&t=002337

    ]http://www.c-plusplus.net/ubb/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=37&t=002337[/QB][/QUOTE][/url]
    na, und. mich kümmerts nicht, wenn da ein unregistrierter troll weint.



  • @volkard
    gib dir n ruck und sach mir wie ich weiterkomm ... dass das mit dem vector nich ganz astrein ist, das hab ich so ein wenig schon geschnallt... natürlich is das nett gemeint von kingRuedi aber es verwirrtt mich da ich dann wieder sachen versuche/nachlese die mich nicht weiterbringen.
    trotzdem, jeder der mir weiterhilft --> n virtuelles bussi 😉
    silke



  • @volkar ... da haben wir wohl fast zeitgleich geschrieben ...
    ich schau mir das nun mal genauer an und quetsch dich wieder aus 😉
    silke



  • Original erstellt von Silke_verzweifelt:
    @volkar ... da haben wir wohl fast zeitgleich geschrieben ...
    ich schau mir das nun mal genauer an und quetsch dich wieder aus 😉
    silke

    aber auf sowas wie von 02.05.2003 20:58 kann ich nicht antworten.
    das war von oben nach unten geplant und kein einzuges detail stimmt oder ist gar ausgführt. so wird das nix. lieber von unten nach oben aubeiten. erstmal nur ne funktion, die nen datensatz einfügen kann. und die wird in der main direkt aufgerufen, ganz ohne menu und so. wenn das klappt, kann man auch mal 3 einfügen und suchen machen. und so weiter. ganz zum schluss das menu drum.



  • jo schreib erst alle functions mit nem menu kannste immernoch machen!!
    hoer auf volkard der hats drauf...fg

    wenn ihr sollche aufgaben bekommt und du nix peilst, kauf dir erstma n gutes buch, les es... dann nochmal...fg und schon solltest du mehr verstehn!



  • @I_Code_4_Food ..dein beitrag hilft mir ungemein ...
    @volkard danke ich komm ganz gut voran nur gibt

    int anzahl=sizeof(pDat);//Offset-Zeiger
    

    genau 4Byte aus --> schlecht! Ansonsten klappt es dass ich meine PDat.dat mit den Artikeln fülle und auch die iDat mit beschreibe. Nur der Offset ...
    Bitte einen kleinen Denkanstoss... 😉
    Silke



  • meintest du

    int anzahl = Dateigröße / sizeof(Datensatz);
    

    ansonsten: wie ist deine PDat struktur aufgebaut?



  • @Korbinian .. ja da fehlte ja noch was..danke nun hab ich das mal so implementiert. Wenn ich mir den Offset nun ausgeben lasse siet das folgendermassen aus ...

    Art_Nr: 1 Offset: 0
    Art_Nr: 2 Offset: 16
    Art_Nr: 3 Offset: 32

    int handle;
        handle = open("prim.dat",O_RDONLY | O_BINARY);
        int anzahl= filelength(handle)/ sizeof(pDat);  
             // für meinen Offset-Zeiger
    

    jetzt muss ich zusehn wie ich hinbekomme dass ich über den offset der Index-Datei auf die richtige Stelle in der Primärdatei zugreifen kann um den dortigen Datensatz auszugeben ....
    Stück für Stück bekomm ich das dank eurer hilfe schon hin ... 😉 😉 😉
    silke



  • Original erstellt von Korbinian:
    **meintest du

    int anzahl = Dateigröße / sizeof(Datensatz);
    

    ansonsten: wie ist deine PDat struktur aufgebaut?**

    pDat ist wohl eine Zeiger auf nen Datensatz. Zeiger sind immer 4 bytes groß. sizeof(*pDat) würde gehen. Aber lieber so machen, wie Korbinian sagt.



  • Original erstellt von Silke_verzweifelt:
    jetzt muss ich zusehn wie ich hinbekomme dass ich über den offset der Index-Datei auf die richtige Stelle in der Primärdatei zugreifen kann um den dortigen Datensatz auszugeben...

    ist doch nicht so schwer: da du weist, an welcher dateiposition die Information steht, und wie lang diese dann ist, brauchst du eigentlich nur so vorgehen:

    in der primärdatei:
    Datensatz *satz = new Datensatz;
    satz = dynamic_cast<Datensatz>(lese_bytes_von_bis(Offset, Offset + sizeof(Datensatz)));
    // uh, ob der cast 100% richtig ist? bitte verbessert mich!
    

    und schon hast du den gewünschten datensatz im speicher, und kannst damit machen, was du willst. (nur später nicht vergessen, den speicherplatz wieder freizugeben)

    edit
    zum lesen: ifstream::read
    zum position setzen: ifstream::seekg

    [ Dieser Beitrag wurde am 04.05.2003 um 17:27 Uhr von Korbinian editiert. ]



  • denke eher an

    Datensatz satz;
    fseek(pimdatei,pos*sizeof(Datensatz),BEGIN);
    fread(primdatei,reinterpret_cast<char*>(&satz),sizeof(Datensatz));
    


  • @all ... es tut gut wenn man weiterkommt und auf den richtigen Weg gebracht wird. Die Suche habe ich jetzt erstmal sequenziell geschrieben um zu prüfen ob das funzt der Zugriff über die index.dat. Also key wird mir als Parameter aus main übergeben und soll die Artikelnummer sein.
    Und siehe da... es funzt super ... die Eingabe ... die Suche ...

    fseek(iDat,key-1*sizeof(int_Paar),SEEK_SET);
    fread(&int_Paar,sizeof(int_Paar),1,iDat);
    
    fseek(pDat,(int_Paar.offset)*sizeof(art_Eingabe),SEEK_SET);
    fread(&art_Eingabe,sizeof(art_Eingabe),1,pDat);
    

    nun werd ich an die binäre Suche rangehen, ich hab ja noch eine nacht Zeit bis zur Abgabe 😉
    Silke


Anmelden zum Antworten