Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hilfe beim binären Suchen

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
14.07.2005, 15:53 Uhr
Pascal-Hahn



Hallo comunity,

schlagt mich nicht, wenn ich im flaschen Forum poste, aber ich bin neu hier. Und hab schon direkt ein "Problem". Ich will in meiner Datei binär suchen. Soweit ist das auch kein Problem. Aber mein Programm läuft erst einmal die while schleife "im leerlauf" durch und gibt mit dann erst das Ergebnis aus. Hier mal der Code:


Code:

bool found=false;
string suchbegriff;
dat.open(pfad.c_str(),ios::in | ios::binary);
cout<<"Suchbegriff eingeben (Name): ";getline(cin,suchbegriff);
while(!found && dat.read((char*)&daten,sizeof(daten)))
    {
   // Es gab eine uebereinstimmung
   if (suchbegriff == daten.name) found = true;
   if (found)
       {
      cout<<"\nNummer: "<<daten.nummer;
      cout<<"\nName: "<<daten.name;
      cout<<"\nTyp: "<<daten.typ;
      cout<<"\nBeschreibung: "<<daten.beschreibung;
      cout<<"\nGenre: "<<daten.genre;
      cout<<"\nLaenge: "<<daten.laenge;
      }
   else
       {
      cout<<"Die Suche ergab keine Uebereinstimmung!";
      }
    }



Wenn er was gefunden hat sieht die Ausgabe so aus:



Code:

Die Suche ergab keine Uebereinstimmung!
Nummer: 1
Name: Test
Typ: DVD
Beschreibung: Testbeschreibung
Genre: Action
Laenge: 110



weiß jemand von euch woran das hängen kann?

Gruß Pascal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.07.2005, 16:11 Uhr
Skippy



du hast einen fehler in der if schleife wenn ich das richtig sehe


ich gehe mal davon aus das es einen unterschied ausmacht wenn du einen suchbegriff eingibst den er nicht finden kann (steht also nicht in der datei) und einen suchbegriff den er finden konnte da er in der datei steht.


auf jedenfall falsch ist folgendes


C++:
if (found)


probehalber mache daraus doch mal folgendes


C++:
if (found==TRUE)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.07.2005, 16:16 Uhr
Pascal-Hahn



naja das found ne boolsche Variable ist, ist

if (found) genau das selbe wie if(found==true) Zumindest bei dem Borland Compiler
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.07.2005, 16:58 Uhr
Tommix



Hallo,
bei jedem Durchlauf der Schleife, bei dem nichts gefunden wird, gibst Du "nichts gefunden" aus. Nimm mal den if(found) Block aus der While Schleife raus und setze ihn dahinter.
Von dem was Skippy behauptet, stimmt mehr oder weniger nichts (nix für ungut). Weder gibt es eine "if-Schleife", noch ist der Befehl falsch angewandt.

Gruß, Tommix


Bearbeitung:

Ups ich seh grade, daß wäre zu einfach:

C++:
// ...
if (suchbegriff == daten.name)
{
   found = true;
   break; // Hier müssen wir natürlich abbrechen, damit wir auch den richtigen datensatz haben!
}
} // ende der while Schleife
if (found)
{
  // Ausgabe
  // ...




Dieser Post wurde am 14.07.2005 um 17:02 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.07.2005, 17:27 Uhr
Pascal-Hahn



danke jetzt funktionierts

naja das mit dem break ist ja selbstverständlich *gg*

Blöder Fehler aber auch *gg*

Jetzt muss ich die suche nur noch so abändern, dass der auch Teilstrings als ergebnis akzeptiert, denn so findet er nur eine Übereinstimmung wenn der Suchbegriff genau wie der Datenbankeintrag ist


/* EDIT */

So habs geschafft und ihr sollt auch was davon haben wenn ihr mal so ein Problem habt


Code:

void datensatz::suchen(string& pfad)
{
int pos=0;
bool found=false;
string suchbegriff;
dat.open(pfad.c_str(),ios::in | ios::binary);
cout<<"Suchbegriff eingeben (Name): ";cin>>suchbegriff;

while(!found && dat.read((char*)&daten,sizeof(daten)))
    {
   string check = ""; check = daten.name;
   pos = check.find(suchbegriff);
   if (NPOS!=pos) {found = true;break;}
    }

// Auswertung der Suche
if (found)
       {
      cout<<"\nNummer: "<<daten.nummer;
      cout<<"\nName: "<<daten.name;
      cout<<"\nTyp: "<<daten.typ;
      cout<<"\nBeschreibung: "<<daten.beschreibung;
      cout<<"\nGenre: "<<daten.genre;
      cout<<"\nLaenge: "<<daten.laenge;
      }
        else
        {
         cout<<"Die Suche ergab keine Uebereinstimmung!";
      }
dat.close();
// Modul ende
}


Dieser Post wurde am 14.07.2005 um 17:38 Uhr von Pascal-Hahn editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.07.2005, 19:29 Uhr
Skippy



bin bei if(found) von meinen kompiler bzw IDE ausgegangen.
Ich nutze DEV-C und für den scheint es einen unterschied zu machen ob ich if(found) oder
if(found==TRUE) denn nur 2.akzeptiert er um einen unterschied zwischen den werten TRUE und FALSE zu nehmen bei der 1. möglichkeit scheint er wenn ich das bis jetzt richtig verstanden habe nur zu prüfen ob die variable/string usw existiert selbst if(found=TRUE) was ich schon in manchen codes gesehen hab geht bei dev-c nicht
@TOMMIX zumindest laut dem c++ syntax ist der falsch angewand da der standart eigentlich vorgibt das man das so schreibt wie ichs "verbessert hatte" den nur die schreibweise müssen alle compiler verstehen aber solange es funktioniert is das ja egal warscheinlich ist dev-c der einzige der damit wieder nicht klarkommt
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.07.2005, 19:45 Uhr
Tommix




Zitat von Skippy:

@TOMMIX zumindest laut dem c++ syntax ist der falsch angewand da der standart eigentlich vorgibt das man das so schreibt wie ichs "verbessert hatte"...

Da irrst Du.

C++:
bool ausdruck;
if (ausdruck == true)


ist völlig equivalent zu

C++:
if (ausdruck)


und bereits im Ur-C waren

C++:
int ausdruck;
if (ausruck != 0)
{...}


identisch mit

C++:
if (ausdruck)
{...}


Ich kann mir kaum vorstellen, daß das ein Compiler anders sieht.

Gruß, Tommix


Bearbeitung:

Ich habe jetzt mal vorausgesetzt, das ausdruck immer einen gültigen Wert hat, sprich keine uninitialisierte Variable ist. Ansonsten müsste Bsp. 1 auch
C++:
if ausdruck != false)
lauten. BTW kann man zur Laufzeit nicht prüfen, ob eine Variable existiert. Code mit nicht existierenden Variablen läßt sich gar nicht compilieren.

- Tommix


Dieser Post wurde am 14.07.2005 um 19:50 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.07.2005, 20:00 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von Skippy:
1. möglichkeit scheint er wenn ich das bis jetzt richtig verstanden habe nur zu prüfen ob die variable/string usw existiert selbst if(found=TRUE) was ich schon in manchen codes gesehen hab geht bei dev-c nicht

Dein Compiler wird kein Programm übersetzen indem du eine Variable verwendest die nicht vorher deklariert wurde (existiert), deshalb würde es auch keinen Sinn machen einen Mechanismus einzubauen mit dem man feststellen kann ob eine Variable existiert.
if(found=true) ist eine Zuweisung und kein Vergleich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: