Avatar billede deadmez Nybegynder
23. november 2004 - 08:54 Der er 27 kommentarer og
1 løsning

Kartotek der skal kunne gemme til fil

Jeg har lavet et lille kartotek som er baseret på struct.. dette vil jeg meget gerne have til at kunne skrive til en fil når jeg lukker mit lille program... og indlæse data igen når mit program startes...
Programmet er skrevet til konsol skal det lige siges..

Er der nogen der kan hjælpe mig ?
Avatar billede arne_v Ekspert
23. november 2004 - 09:07 #1
Jeg havde det her eksmepel på lager:

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

using namespace std;

int main()
{
  cout << "-----------------" << endl;
  ifstream f1("test.dat");
  while(!f1.eof())
  {
      string date;
      int age;
      f1 >> date >> age;
      if(f1)
      {
        cout << "| " << date << " | " << age << " |" << endl;
        cout << "-----------------" << endl;
      }
  }
  string date;
  int age;
  cout << "Enter date as dd.mm.yy and age: ";
  cin >> date >> age;
  ofstream f2("test.dat", ios::app);
  f2 << date << " " << age << endl;
  f2.close();
  return 0;
}

måske kan det give lidt inspiration.
Avatar billede deadmez Nybegynder
23. november 2004 - 09:09 #2
damn... glemte at nævne at mit prog er skrevet i standard C.... så får ikke rigtig noget ud af C++ kode... sorry arne_v.. :(
Avatar billede arne_v Ekspert
23. november 2004 - 10:27 #3
detalje !

Så skal du naturligvis bruge fopen,fscanf,fprintf og fclose.
Avatar billede arne_v Ekspert
23. november 2004 - 10:37 #4
kartotek.dat:

Anders 1
Børge 2
Christian 3

kartotek.c:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct person
{
    char navn[20];
    int nr;
};


int main()
{
  FILE *fp;
  struct person kartotek[100];
  int antal,i;
  // læs
  fp = fopen("kartotek.dat", "r");
  antal = 0;
  while(!feof(fp))
  {
      fscanf(fp,"%s %d\n",kartotek[antal].navn,&kartotek[antal].nr);
      antal++;
  }
  fclose(fp);
  // tilføj en person
  strcpy(kartotek[antal].navn,"Dorthe");
  kartotek[antal].nr = 4;
  antal++;
  // skriv
  fp = fopen("kartotek.dat", "w");
  for(i=0;i<antal;i++)
  {
      fprintf(fp,"%s %d\n",kartotek[i].navn,kartotek[i].nr);
  }
  fclose(fp);
  return 1;
}
Avatar billede deadmez Nybegynder
23. november 2004 - 10:44 #5
javel ja.... det ser lidt mere forståeligt ud for mig.. :D vil lige kigge på det og se om jeg kan få det til at virke..
Avatar billede deadmez Nybegynder
23. november 2004 - 10:53 #6
læste forresten at man også kunne bruge fgets() og fputs()...
ville det være en mulighed der måske var brugbar da jeg har 8 strenge pr. struct..??
Avatar billede arne_v Ekspert
23. november 2004 - 11:03 #7
fgets og fputs henholdsvis læser og skriver hele linier.

Hvis du vil gemme hvert felt i struct'en i sin egen linie, så er de et glimrende valg.

Hvis du vil gemme en struct per linie og adskille felter med mellemrum, så
er fscanf/fprintf nok bedre.
Avatar billede deadmez Nybegynder
24. november 2004 - 13:48 #8
okay... jeg har nu fået ordnet skrivningen til en fil... ved hjælp af fwrite() har jeg gemt alle de info jeg skulle bruge... nu mangler jeg så bare lige at kunne genindlæse filen til mit program... men har en lille ide om hvordan den skal løses..

arne_v.. hvis du lægger et svar så giver jeg point.. det hjalp mig igang med det sidste eksempel du postede..
Avatar billede arne_v Ekspert
24. november 2004 - 13:51 #9
Hvis du bruger fwrite, så skal du nok læse med fread.

fwrite/fread er normalt til at skrive/læse filer i binært format i
modsætniong til fprintf/fscanf som er til tekst.
Avatar billede arne_v Ekspert
24. november 2004 - 13:51 #10
svar
Avatar billede deadmez Nybegynder
24. november 2004 - 13:53 #11
jeps... fandt jeg ud af... mit kartotek kører perfekt... nu vil jeg prøve og lave det i "windowsmode" i stedet...
Avatar billede deadmez Nybegynder
25. november 2004 - 11:03 #12
okay... det kører vist ikke helt alligevel... :( jeg skal have structs indlæst med fread... men det kører ikke lige som jeg vil...
Avatar billede arne_v Ekspert
25. november 2004 - 11:09 #13
Hvordan ser din kode som bruger fread ud ?

Og hvad er fejlen ?
Avatar billede deadmez Nybegynder
25. november 2004 - 11:52 #14
jeg har aldrig brugt fil I/O før så det kan godt være at min kode er helt ude i skoven..


------------------
while( fread(&(ptrthis), sizeof((*ptrthis)), 1, fileptr) != EOF)
            {
                fread(&(ptrthis), sizeof((*ptrthis)), 1, fileptr)
                if(t == 1)
                {
                    ptrfirst = ptrthis;
                }
                t++;
            }
--------------------------------

fejlen... tjaeh... mit program crasher bare.. og winxp brokker sig over det..
Avatar billede arne_v Ekspert
25. november 2004 - 12:00 #15
Det må skulle være enten

fread(ptrthis, sizeof(*ptrthis), 1, fileptr)

eller

fread(&ptrthis, sizeof(ptrthis), 1, fileptr)

afhængig af om ptrthis er en pointer eller ej.
Avatar billede arne_v Ekspert
25. november 2004 - 12:00 #16
Og så tror jeg at den anden fread ikke skal være der.
Avatar billede deadmez Nybegynder
25. november 2004 - 12:04 #17
hehe.... okay... som sagt.. jeg er rimelig ny inden for fil i/o..
Avatar billede deadmez Nybegynder
25. november 2004 - 12:07 #18
jeg har brugt den her fread(ptrthis, sizeof(*ptrthis), 1, fileptr)

og nu står mit program bare og kører i loop..... kan ikke gøre andet end at afslutte det med ctrl + c
Avatar billede deadmez Nybegynder
25. november 2004 - 12:15 #19
jeg tænkte lidt på... min oprettelse af structs.... er lavet med en doublelinked list... kan det være et problem for mit program ?
Avatar billede arne_v Ekspert
25. november 2004 - 12:16 #20
prøv:

while(fread(ptrthis, sizeof(*ptrthis), 1, fileptr) > 0)
{
  ...
}
Avatar billede deadmez Nybegynder
25. november 2004 - 12:18 #21
hvis du vil have lidt mere indsigt i min kode... det kunne jo være en ide.. så bare skriv din mail adr.. så sender jeg min source kode..
Avatar billede deadmez Nybegynder
25. november 2004 - 12:22 #22
næh... hov... nu virker det sq...
Avatar billede arne_v Ekspert
25. november 2004 - 12:29 #23
:-)
Avatar billede arne_v Ekspert
25. november 2004 - 12:30 #24
med hensyn til linked liste, så skal du opdatere pointerne efter at du har læst
struct'ene op fra disk !
Avatar billede deadmez Nybegynder
25. november 2004 - 12:31 #25
ja.. det fandt jeg ud af... det virker... bare ikke hundrede procent endnu... kigger lige lidt videre...

programmet læser det sidst oprettede medlem ud først.. og så kommer der en gang bavl.... som jeg ikke har indtastet.. og så crasher mit prog..
Avatar billede deadmez Nybegynder
25. november 2004 - 12:32 #26
if((fileptr=fopen("data.arch", "r"))==NULL)
            {
                printf("\nDatafilen er tom\n\n");
                system("pause");
                return;
            }
            fileptr = fopen("data.arch", "r");
            ptrthis = malloc(sizeof(struct kartotek));
            while(fread(ptrthis, sizeof(*ptrthis), 1, fileptr) > 0)
            {
                ptrthis = malloc(sizeof(struct kartotek));
                if(t == 1)
                {
                    ptrfirst = ptrthis;
                }
                else if(t == 2)
                {
                    ptrfirst->ptrnext = ptrthis;
                    ptrthis->ptrprev = ptrfirst;
                    ptrlast = ptrthis;
                }
                else
                {
                    ptrlast->ptrnext = ptrthis;
                    ptrthis->ptrprev = ptrlast;
                    ptrlast = ptrthis;
                }       
                t++;
            }
            ptrlast = ptrthis;
            fclose(fileptr);
Avatar billede deadmez Nybegynder
25. november 2004 - 12:55 #27
hmmm poster lige den opdaterede sourcekode...

-----------------------------------
void skriv_laes(void)
{
    char valg;
    int t = 1;
   
   
   
    system("cls");
    printf("1. Skriv til fil\n2. Laes fra fil\n3. Tilbage\n\n");
    valg = getch();
   
    switch(valg)
    {
        case '1' :
            if(ptrfirst == NULL)
            {
                printf("\nListen er tom\n\n");
                system("pause");
                return;
            }
            else
            {
            fileptr = fopen("data.arch", "w");   
            ptrthis = ptrfirst;
            do
            {
                fwrite(&(*ptrthis), sizeof((*ptrthis)), 1, fileptr);
                ptrthis = ptrthis->ptrnext;   
            }
            while(ptrthis != NULL);
            printf("\nData gemt\n\n");
            fclose(fileptr);
            system("pause");
            }         
            break;
        case '2' :
            if((fileptr=fopen("data.arch", "r"))==NULL)
            {
                printf("\nDatafilen er tom\n\n");
                system("pause");
                return;
            }
            fileptr = fopen("data.arch", "r");
            ptrthis = malloc(sizeof(struct kartotek));
            while(fread(ptrthis, sizeof(*ptrthis), 1, fileptr) > 0)
            {
                ptrthis = malloc(sizeof(struct kartotek));
                if(t == 1)
                {
                    ptrfirst = ptrthis;
                }
                else if(t == 2)
                {
                    ptrfirst->ptrnext = ptrthis;
                    ptrthis->ptrprev = ptrfirst;
                    ptrlast = ptrthis;
                }
                else
                {
                    ptrlast->ptrnext = ptrthis;
                    ptrthis->ptrprev = ptrlast;
                    ptrlast = ptrthis;
                }       
                t++;
            }
            ptrlast->ptrnext = NULL;
            medlemtaeller = ptrlast->medlemsnr;
            fclose(fileptr);
            break;
        case '3' :
            return;
    }
}   
--------------------------------------
Avatar billede deadmez Nybegynder
25. november 2004 - 13:37 #28
Så nu virker det som jeg vil have det til....

------------------------------
void skriv_laes(void)
{
    char valg;
    int t = 1;
   
   
   
    system("cls");
    printf("1. Skriv til fil\n2. Laes fra fil\n3. Tilbage\n\n");
    valg = getch();
   
    switch(valg)
    {
        case '1' :
            if(ptrfirst == NULL)
            {
                printf("\nListen er tom\n\n");
                system("pause");
                return;
            }
            else
            {
            fileptr = fopen("data.arch", "w");   
            ptrthis = ptrfirst;
            do
            {
                fwrite(&(*ptrthis), sizeof((*ptrthis)), 1, fileptr);
                ptrthis = ptrthis->ptrnext;   
            }
            while(ptrthis != NULL);
            printf("\nData gemt\n\n");
            fclose(fileptr);
            system("pause");
            }         
            break;
        case '2' :
            if((fileptr=fopen("data.arch", "r"))==NULL)
            {
                printf("\nDatafilen er tom\n\n");
                system("pause");
                return;
            }
            fileptr = fopen("data.arch", "r");
            ptrthis = malloc(sizeof(struct kartotek));
            do
            {
                if(t == 1)
                {
                    ptrfirst = ptrthis;
                    ptrthis->ptrprev = NULL;
                }
                else if(t == 2)
                {
                    ptrthis = malloc(sizeof(struct kartotek));
                    ptrfirst->ptrnext = ptrthis;
                    ptrthis->ptrprev = ptrfirst;
                    ptrlast = ptrthis;
                }
                else
                {
                    ptrthis = malloc(sizeof(struct kartotek));
                    ptrlast->ptrnext = ptrthis;
                    ptrthis->ptrprev = ptrlast;
                    ptrlast = ptrthis;
                }       
                t++;
            }
            while(fread(ptrthis, sizeof(*ptrthis), 1, fileptr) > 0);
            ptrfree = ptrlast;
            ptrlast = ptrlast->ptrprev;
            ptrlast->ptrnext = NULL;
            free(ptrfree);
            medlemtaeller = ptrlast->medlemsnr;
            fclose(fileptr);
            break;
        case '3' :
            return;
    }
}
----------------------------------
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