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 ?
Annonceindlæg fra Infor
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.
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.. :(
23. november 2004 - 10:27
#3
detalje ! Så skal du naturligvis bruge fopen,fscanf,fprintf og fclose.
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; }
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..
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..??
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.
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..
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.
24. november 2004 - 13:51
#10
svar
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...
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...
25. november 2004 - 11:09
#13
Hvordan ser din kode som bruger fread ud ? Og hvad er fejlen ?
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..
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.
25. november 2004 - 12:00
#16
Og så tror jeg at den anden fread ikke skal være der.
25. november 2004 - 12:04
#17
hehe.... okay... som sagt.. jeg er rimelig ny inden for fil i/o..
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
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 ?
25. november 2004 - 12:16
#20
prøv: while(fread(ptrthis, sizeof(*ptrthis), 1, fileptr) > 0) { ... }
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..
25. november 2004 - 12:22
#22
næh... hov... nu virker det sq...
25. november 2004 - 12:29
#23
:-)
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 !
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..
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);
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; } } --------------------------------------
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; } } ----------------------------------
Kurser inden for grundlæggende programmering