Avatar billede dinirex Nybegynder
11. januar 2008 - 14:49 Der er 8 kommentarer og
1 løsning

Søgning i database

Hey...

Jeg har programmering i C++ på niveau c... Vi har fået stillet til opgave at lave et program, der kan oprette en database, hvor man kan indskrive dvd'er med diverse info (skuespiller, spilletid osv.)

Vi har endnu ikke fået undervisning i hvordan man skal lave dette program, meen det har da ikke holdt mig tilbage...

Følgende kode opretter databasen:


KODE

#include <iostream>
#include <fstream>
#include <string>


using namespace std;

void nydatabasefunktion(void);

void nydatabasefunktion(void)
    {
        system("cls");
        int y(0), antal;
        char navn[10];
        string info;
        cout << "Skriv navnet paa databasen? (afslut med .txt)" ;
        cin >> navn;
        cout << "Hvor mange data'er oensker du at tilfoeje (f.eks. 10 film)? ";
        cin >> antal;
        cin.get();
        system("cls");
        do
        {
            ofstream a_file ( navn, ios::app);
            a_file<<"\n";
            cout << "Skriv data'erne, f.eks. (navn, spilletid, skuespiller; Brad Pitt; Jolie; osv.)";
            getline(cin, info);
            a_file<<info;
            y++;
            a_file.close();
            system("cls");
        }
        while(y<antal);
       
    }

/KODE




Følgende kode brugers til at ændre i eksisterende database:



KODE

#include <iostream>
#include <fstream>
#include <string>


using namespace std;

void eksdatabasefunktion(void);

void eksdatabasefunktion(void)
    {
        system("cls");
        int y(0), antal;
        char navn[10];
       
        string info2;
        cout << "Skriv navnet paa databasen du oensker at vedlaegge ny data i? (afslut med .txt)" ;
        cin >> navn;
        ofstream a_file ( navn, ios::app);
        cout << "Hvor mange data'er oensker du at tilfoeje (f.eks. 10 film)? ";
        cin >> antal;
        cin.get();
        system("cls");
        do
        {
            ofstream a_file (navn, ios::app);
            a_file<<"\n";
            cout << "Skriv data'erne, f.eks. (navn, spilletid, skuespiller; Brad Pitt; Jolie; osv.)";
            getline(cin, info2);
            a_file<<info2;
            y++;
            a_file.close();
            system("cls");
           
        }
        while(y<antal);
    }   
   
/KODE



Mit problem er så, at jeg ikke ved hvordan man søger i en tekst fil...

Har jeg f.eks. følgende til at stå i databasen:

Harry Potter, 2 timer og 3 min, Emma Watson
Cute girl ahead, 1 time og 20 min, Emma Watson
Halloween, 2 timer og 7 min,


Så vil jeg gerne kunne søge på Emma Watson, og så skal der komme alle de film frem hvor hun spiller med i. I dette tilfælde skulle 2 af de overstående film komme frem på skærmen...

Men hvordan gør jeg det?
Avatar billede arne_v Ekspert
11. januar 2008 - 15:07 #1
Laeser alle linier og tester hver linie for om den matcher krav.
Avatar billede dinirex Nybegynder
11. januar 2008 - 15:14 #2
ja, men tænkte nu nærmere på en funktion der kunne det...

Hvis man skal finde noget i en string kan man jo bruge navn.find('Emma')

Men nu skal den søge i en tekst fil, og ikke i selve programmet, hvordan gør man det... er der en smart funktion?
Avatar billede arne_v Ekspert
11. januar 2008 - 15:21 #3
No.

Lav din egen funktion som laeser alle linier og tester.
Avatar billede dinirex Nybegynder
11. januar 2008 - 15:35 #4
Jamen arne v det er jo det jeg prøver at fortælle dig... Jeg ved ikke hvordan man læser tekst filen, kan kun skrive til den, det er derfor jeg søger hjælp herinde... Det er jo ikke nemt at lave en funktion, der læser alle linierne, når man ikke ved hvordan man læser i en tekst fil...
Avatar billede arne_v Ekspert
11. januar 2008 - 15:55 #5
Ah !

  ifstream f(filnavn);
  while(!f.eof())
  {
      string line;
      getline(f,line);
      // process line
  }
Avatar billede bertelbrander Novice
11. januar 2008 - 19:25 #6
Arnes løsning er sådan set fin, der er et lille problem, den vil læse en linje for meget.

En lidt bedre version:
  ifstream f(filnavn);
  string line;
  while(getline(f,line))
  {
      // process line
  }
Avatar billede dinirex Nybegynder
12. januar 2008 - 13:41 #7
Okay, men jeg har gjort følgende:

    ifstream readfile(navn);
    while(!readfile.eof())
    {
        string soegresultat;
        getline(readfile,soegresultat);
        int k = soegresultat.find(soeg);
       
        if(k > 0)
        {
            cout << soegresultat << "\n";
        }
    }

Så selv om den læser en linie for meget, burde det ikke have nogen betydning...

Men jeg siger tak for hjælpen, og arne v skriver du lige et svar?
Avatar billede arne_v Ekspert
12. januar 2008 - 23:39 #8
Om .eof løsningen læser en linie for meget eller den anden en linie for lidt afhænger af
om man betragter linier som adskilte eller som terminerede.

Men fra en praktisk synsvinkel så er man næppe interesseret i den blanke linie i
tilfælde af at den sidste rigtige linie er efterfulgt af CRLF.

Så jeg synes at du skal ændre koden som Bertel foreslår:

    while(!readfile.eof())
    {
        string soegresultat;
        getline(readfile,soegresultat);
        ...

->

    string soegresultat;
    while(getline(readfile,soegresultat))
    {
        ...
Avatar billede arne_v Ekspert
12. januar 2008 - 23:39 #9
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester