Avatar billede shj Nybegynder
20. september 1999 - 00:23 Der er 3 kommentarer og
2 løsninger

søgning i en fil

Jeg sidder og har gang i lidt spændende programmering omkring lagring af
data i en fil.

jeg har en klasse (ansat) som indeholder person oplysninger, dem skriver jeg
til en fil med linien
ansatte.write ((char*)&medarbejder,sizeof(ansat)); file://hvor medarbejder
er et objekt af klassen ansat
ansatte.close();
så vil jeg jo gerne læse filen igen og til det har jeg lavet en lille krølle
ifstream ansatfil("ansat.dat",ios::in);

while(!ansatfil.eof())
{
ansatfil.read((char*)&medarbejder, sizeof(ansat));
cout<<endl<<endl;
cout <<"her lases fra filen"<<endl;

cout <<medarbejder.name<<endl;
cout <<medarbejder.adresse<<endl;
cout <<medarbejder.telefon<<endl;
cout <<medarbejder.gage<<endl;
cout <<medarbejder.cprnr<<endl;
}

Hvordan kan jeg søge på en bestemt "post" i filen, eks. navn eller telefon
nr og er denne måde at bruge filhåndtering på i c++ ikke random access.  Jeg
ville blive glad hvis der var en der kunne give mig et hint eller aha
oplevelse så jeg kan komme videre

Hilsen Simon Jespersen
ps.. håber ikke i bliver sure på mig over alle de dumme spørgsmål "bjarke" og "soepro"

Avatar billede bjarke Nybegynder
20. september 1999 - 09:22 #1
Overhovedet ikke! Der er ikke noget der hedder dumt - og i øvrig kan jeg da se, at du snart overhaler mig med den udvikling du er i gang med;-) I øvrigt kunne vi jo bare lade være med at bruge energi på dem, hvis ikke vi gad!

Hvis du skal søge efter bestemte poster, så kan jeg se to måder at gøre det på:
1) Indlæse en post, og så kontrollere den værdi du er interesseret i. Det kan synes nollert, men det er jo det samme du gør, hvis posterne ligger i memory. Der behøver du bare ikke først at indlæse posterne enkeltvis, men du gennemløber jo stadig alle posterne.
2) Alternativt, så er du nødt til at lagre posterne efter et system. Her er der så temmelig mange muligheder. Men systemet kan jo ikke tilgodese alle former for søgning. Man kunne f.eks. vælge at poster skulle gemmes i alfabetisk orden og hvis filen, så er lang, så kunne man f.eks. i starten af filen lagre en række pointere, som fortalte hvor i filen posterne lå, som begyndte med a og b og c osv. Til gengæld vil du så ikke vinde noget når du skulle søge efter telefonnumre:-(
Avatar billede bjarke Nybegynder
20. september 1999 - 09:23 #2
Hovsa - ovenstående er altså et svar:-)

soepro >> hi hi - to gange er jeg kommet først her til morgen ;-)
Avatar billede soepro Nybegynder
20. september 1999 - 11:22 #3
Hvis du vil kunne søge ordentligt på data i en fil, er der ingen vej udenom en eller anden form for indeksering af dine data. Hvis du kører under C++ Builder er det en del af pakken med integration til Paradox eller dBase filer, som man kan lave indekser på.

Ellers er der kun tilbage at du selv laver/vedligeholder en indeks over datatene i din tabel. I den sammenhæng er mængden af data altafgørende for hvordan du skal gribe det an.

Hvis du kun har små mængder data, ville jeg lave en sorteret tabel med de relative post-numre på dine data (i den orden du nu gerne vil søge på, f.eks. vha. den indbyggede QSORT funktion - se andre svar her på eksperten) og så simpelhen gemme den i en anden fil, f.eks. med "efternavnet" .IDX. Når du så skal arbejde på filen, kan du bare læse tabellen fra .IDX filen ind i programmet, og benytte de post-numre til den relative fil, som du gemte der, til at lave en fornuftig læsning.

Hvis du derimod har store mængder data - eller meget svingende antal, mener jeg du skal lave en decideret database med et B++-tree indeks fil til. OG ... tilfældigvis, har jeg sådan et modul liggende du kan få en kopi af, hvis du er interesseret. I så fald fly mig din e-mail adresse, så skal jeg sende dig et attachment med koden til den.
Avatar billede shj Nybegynder
20. september 1999 - 11:46 #4
Hej med jer :-) , kunne en måde at søge post på i en almindelig datafil være sådan her?
while(!not datafil)
{
  if(object.navn==søgestreng)
  {
  ansatfil.read((char*) &medarbejder,      sizeof(ansat));
cout<<endl<<endl;
cout <<"her lases fra filen"<<endl;

cout <<medarbejder.name<<endl;
cout <<medarbejder.adresse<<endl;
cout <<medarbejder.telefon<<endl;
cout <<medarbejder.gage<<endl;
cout <<medarbejder.cprnr<<endl;
}
//jeg ved godt det måske er lidt simpelt, men bare lige for forståelsen.
soepro jeg vil gerne kigge på det modul, min email er shj@get2net.dk

Avatar billede bjarke Nybegynder
20. september 1999 - 12:05 #5
Både ja og nej:

1) Det skal hedde while(!datafil.eof())
2) Du kan ikke bruge ==. Du skal bruge strcmp(), som sammenligner strengene og returnerer 0 hvis de er ens (som soepro skriver andetsteds, så er det i virkeligheden adresserne på de 2 strenge du sammenligner med din løsning).
3) Du skal lige bytte om på rækkefølgen. Først skal du indlæse posten og derefter sammenligne værdien (hvis du ikke indlæser posten, så giver det jo ikke mening at søge på postens værdier).
4) Du kan godt bruge æ,ø og å i tekststrenge, men ikke i selve koden.

Altså:

while(!datafil.eof())
{
datafil.read((char*)&medarbejder, sizeof(ansat));
if( strcmp(medarbejder.name,sogestreng)==0 )
  {
  cout << "\n\nher læses filen" << endl;
  // osv
}

hvor medarbejder er et objekt af klassen ansat
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