ich peil garnix ...
-
Wieder was gelernt
-
hastes jetzt hinbekommen?
-
so das hab ich mal bisher geschrieben ....danke für alle tipps bisher
das Problem is noch die Funktion binary_search(...) irgendwas ist an dem Zugriff(den Parametern) noch falsch.
kann ich zum sortieren Einschreiben in die Index-Datei die Methode
lower_bound(....) benutzen und wenn ja vielleicht ein kleine Hilfe???#include <iostream> #include <algorithm> #include <string> #include <stdio> using namespace std; struct art_Eingabe{ int art_Nr; char art_Name[50]; double art_Preis; }; void dat_Schreiben(){ FILE *pDat; pDat = fopen("prim.dat","a+"); if (pDat!=NULL){ //.... //code ........Datensatz einschreiben //.... cout << "pDat geoeffnet"<<endl; FILE *iDat; iDat = fopen("index.dat","w"); if (iDat!=NULL){ // ..lower_bound cout << "iDat geoeffnet"<<endl; } else{ cerr << "Lese/Schreibfehler in iDat"<< endl; } } else cerr << "Lese/Schreibfehler in pDat"<< endl; } void dat_Suchen(int key){ FILE *iDat; iDat = fopen("index.dat","r"); if (iDat!=NULL){ //if(binary_search(iDat.begin(),iDat.end(),key)){ // OFFSET --> pDat // Ausgabe Datensatz cout<<"Datensatz gefunden"<<endl; //} } else cerr << "Lesefehler"<< endl; } void main() { bool ende = false; char antwort; int eingabe; cout << "Artikel.cpp\n"<<endl; cout <<"Artikel-Datensatz durchsuchen oder bearbeiten\n" << endl; while (!ende) { // also erstmal true cout << "Suchen (1) oder Eingeben (2) : " ; cin >> eingabe ; if(eingabe ==1){ int key; cout << "Artikelnummer eingeben: "; cin >> key; dat_Suchen(key); } else if (eingabe == 2){ dat_Schreiben(); } else cerr << "Fehler in main()"<<endl; cout << "Noch einmal (j/n) ? "; cin >> antwort ; cout << endl; ende = (antwort != 'j'); // ende = true oder false } }
bye Silke
-
1. Warum nimmst du FILE und keinen fstream?
2. (siehe Kommentare)dat_Suchen(int key){ FILE *iDat; iDat = fopen("index.dat","r"); // Du öffnest die Datei doppelt! if (iDat!=NULL){ /*iDat ist keine Sequenz! Du musst erst iDat in einen vector<int> einlesen!*/ //if(binary_search(iDat.begin(),iDat.end(),key)){ // OFFSET --> pDat // Ausgabe Datensatz cout<<"Datensatz gefunden"<<endl; //} } else cerr << "Lesefehler"<< endl; }
-
@KingRuediger bitte erklär mir das doch, wieso öffne ich die Datei 2mal??? ich dachte mit iDat = fopen("index.dat","r"); würde ich folgendes erreichen :
index.dat wird lesend geöffnet bzw. neu erstellt falls nicht vorhanden.
kannst du vielleicht noch kurz erklären warum ich fstream nehmen soll?
Ich dachte, dass ich gerade nicht die iDat(Index-Dat) als eine Sequenz einlesen soll, kannst mir auch dazu was schreiben?
Ich find das wirklich sehr nett von euch, dass ihr euch damit befasst und mir die nötigen Denkansätze liefert...
Silke
-
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 anist 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
silkeaber 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...fgwenn 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 gibtint 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?