Avatar billede tuctoh Nybegynder
11. november 2003 - 16:04 Der er 5 kommentarer og
1 løsning

fstream og autoincremental id

Hej,

Jeg sidder med et projekt her på datamatiker uddanelsen, som indebærer at det skal programmeres et sommerhusudlegnings-system.
Dette system skal fungere via fstream.

Gruppen sidder dog fast i programmeringen... hver ejer af sommerhuse skulle gerne have et unikt ID-nummer. Dette findes ved at tage den sidste record i filen, og lægge nummeret fra denne til 1. Det virker bare ikke :s Den giver det samme resultat hver gang (som om den tager det der nu ligger på det sted i rammen, og lægger 1 til...)


Jeg smider hele koden herunder. Projektet skal afleveres mandag, så jeg håber en eller anden kan hjælpe.




#include <iostream>
#include <conio>
#include <fstream>

struct ejertype
{
int ejerid;
int telefon_nr;
char navn[25];
char adresse[50];
};

struct hustype
{
int husid, ejerid, type;
char adresse[50];
};

void behandl_hus_opl();
void slet_hus();
void soeg_hus();
void behandl_ejer_opl();
void behandl_indskr_opl();
void indskriv_hus_opl(hustype);
void indskriv_ejer_opl(ejertype);




void main()
{
    int valg;

  do
  {
      clrscr();
        cout << "          Hovedmenu:\n\n"
            << "1: Opret ejer/hus\n"
            << "2: Søg/opdater hus\n"
            << "3: Søg/opdater ejer (I/T)\n"
            << "4: Afslut program\n";
        cin >> valg;

      switch(valg)
      {
            case 1:
              behandl_indskr_opl();
            break;
        case 2:
          //    behandl_hus_opl();
            break;
        case 3:
            cout << "Ikke tilgængelig\n\n";
            getch();
            break;
      }

  }while(valg!=4);

}


void behandl_indskr_opl()
{
    int valg;
  ejertype ejer;
  hustype hus;
      do
  {
      clrscr();
      cout << "          Opret ejer/hus:\n\n"
          << "1: Indskriv ejer\n"
          << "2: Indskriv hus\n"
          << "3: Tilbage til hovedmenuen\n";
      cin >> valg;
      clrscr();
      fstream ejerkartotek;
      switch(valg)
      {

            case 1:

            //find det næste ejerid
              ejerkartotek.open("ejerkartotek.dat", ios::in|ios::binary);
            ejerkartotek.seekg(sizeof(ejer), ios::end); //find sidste record i fil
            ejerkartotek.read((char*)&ejer, sizeof(ejer));
            ejerkartotek.close();
            ejer.ejerid++;
            hus.ejerid = ejer.ejerid;

            cout << "          Indskriv ejer:\n\n";
            cout << "Indtast ejerens navn: "; cin >> ejer.navn;
            cout << "Indtast ejerens adresse: "; cin >> ejer.adresse;
            cout << "Indtast ejerens telefon nr.: "; cin >> ejer.telefon_nr;
            indskriv_ejer_opl(ejer);
            clrscr();
            cout << "Ejer oprettet.\nTryk en tast for at gå til indskriv hus";
            getch();
            clrscr();

        case 2:
            cout << "          Indskriv hus:\n\n";
            if(valg==2) //hvis ID'et ikke er indtastet
                {
                    cout << "Indtast ejer ID: "; cin >> hus.ejerid;
              }else
              {
                  cout << "Indtast ejer ID: " << hus.ejerid << "\n";
              }
            cout << "Indtast husets adresse: "; cin >> hus.adresse;
            cout << "Indtast husets type: "; cin >> hus.type;
            //indskriv_hus_opl(hus);
            cout << "\n\nHus oprettet.\nTryk en tast for at gå til opret ejer/hus";
            getch();
            clrscr();
            break;
      }
  }while(valg!=3);


}


void indskriv_ejer_opl(ejertype ejer)
{
    fstream ejerkartotek;
  ejerkartotek.open("ejerkartotek.dat", ios::app | ios::binary);
  ejerkartotek.write((char*)&ejer, sizeof(ejer));
  ejerkartotek.close();
}
Avatar billede segmose Nybegynder
11. november 2003 - 16:18 #1
Prøv med
ejerkartotek.seekg(-sizeof(ejer), ios::end); //find sidste record i fil
Avatar billede tuctoh Nybegynder
11. november 2003 - 16:25 #2
hvordan kan et enkelt minus tage 3 timer???
Jeg mente ellers at vi havde prøvet det.

Det virker umidelbart som det skal nu, men vender lige tilbage i morgen når jeg har arbejdet lidt mere med det.

Tak for det hurtige svar.
Avatar billede segmose Nybegynder
11. november 2003 - 17:06 #3
Husk også at ændre

void main()

til

int main()

og returner en værdi fra main

return EXIT_SUCCESS;

som minimum, det første er bare forkert ifølge standarden.
Avatar billede tuctoh Nybegynder
11. november 2003 - 17:47 #4
tjaa, vores lærer vil ikke have vi bruger den metode :p Hun er lidt gammeldags, så standarderne skal desværre ikke følges :p
Avatar billede thomas_nj Nybegynder
11. november 2003 - 18:16 #5
void main() har aldrig været tilladt. Det betragtes af de fleste (inklusiv Bjarne Straustrup) som direkte forkert............
Lidt godnatlæsning til din lærer: http://www.research.att.com/~bs/bs_faq2.html#void-main
Avatar billede tuctoh Nybegynder
14. november 2003 - 15:20 #6
Det virker seg. Hvorfor overså jeg det??

Tak!
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