26. september 1999 - 23:49Der er
33 kommentarer og 1 løsning
sletpost skal kigges efter i denne kode "hjææææælp"
Jeg har nu prøvet at følge Bjarke´s forslag om at rykke resten af fil indholdet tilbage til startposition af den record jeg vil slette og overskrive den. Jeg tror jeg "måske er inde på noget af det rigtige, her er hele programmet,bare så evt. besvare kan få et indtryk af hvad jeg har behov for. Jeg ved godt at det er en gang rod, jeg vil bare have den til at fungere så kan jeg pudse den til bagefter. #include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <string.h> #include <iomanip.h> #include <conio.h> #include <stdio.h> //--------------------------------------------------------------------------- //int index=0; char navn[64]; char efternavn[64]; char adresse[64]; char telefon[11]; float gage = 0; char cprnr[11];
} cout<<"tast e: for exit"<<endl; cin>>back; if(back=='e'){ menuitem(); }
}
void sletdata(void) { int start =0; int startpos =0; int indlaesfra=0;
int i =0;
char svar; ansat medarbejder(navn,efternavn,adresse,telefon,gage,cprnr); fstream sletpost("ansat.dat",ios::in|ios::out); cout <<"skriv navnet paa den person der skal slettes: "<<endl; cin>>navn;
cout <<medarbejder.name<<endl; cout <<medarbejder.sirname<<endl; cout <<medarbejder.adresse<<endl; cout <<medarbejder.telefon<<endl; cout <<medarbejder.gage<<endl; cout <<medarbejder.cprnr<<endl; cout<<endl<<endl; cout<<"Vil du slette denne person (j/n): "<<endl; start= sizeof(ansat); indlaesfra=sletpost.tellg(); sletpost.close(); break; } } cin>>svar; if(svar=='j') { //indeholder start position "start pos" startpos=indlaesfra-start;
//sletpost.close(); // sletpost.seekg(indlaesfra,ios::beg); int i=0,y=0; //udskriver det der skal gen/overskrives fra startpos ifstream talr("ansat.dat",ios::in); talr.seekg(startpos,ios::beg); fstream tmplaes("ansat.dat",ios::in|ios::out); fstream tmpskriv("ansat.dat",ios::in|ios::out); tmpskriv.seekg(indlaesfra,ios::beg); tmplaes.seekg(startpos,ios::beg); while(!talr.eof()) { talr.read((char*)&medarbejder, sizeof(ansat));
void menuitem(void) { int valg; cout <<setw(25)<<"Mit person program"<<endl; cout<<endl; cout<<"hvad vil du fortage dig tast 1 eller 2 eller 3"<<endl<<endl; cout <<"1 Indtaste ny person i registret"<<endl; cout <<"2 find en person i registret"<<endl; cout <<"3 Slette en person fra registret"<<endl; cout <<"4 exit: "<<endl; cin>>valg;
switch (valg){ case 1: { inputdata(); break; } case 2: { soegdata(); break; } case 3: { sletdata(); break; } case 4: abort(); break;
Først lige et par idéer til programmet. Jeg kan altså ikke lade være;-)
1) Ikke nogen kritik, men det er lidt morsomt, at du blander dansk og engelsk (name, sirname, telefon osv). 2) Jeg vil anbefale, at du flytter din switch-case sætning ned i main, for hvordan et program er bygget op, bør fremgå af main. I dit tilfælde, har du sådan set bare flyttet alt indholdet fra main og over i menuitem! 3) Hvis du lægger det hele ind i en do-while løkke, så kan brugeren selv vælge, hvornår han/hun vil stoppe. 4) Alle de løse variable du har i starten (navn, efternavn, osv) bør du lave om til en struct. Det gør det også langt pænere, når du overfører parametrene til en funktion/metode, da der så bliver kun én parameter i stedet for 6 + at så kan man se at de hører sammen.
Hej ! Det virker ikke, jeg har forsøgt at indsætte linien sletpost.seekp(startpos,ios::beg|ios::trunc); , men når jeg vil slette en post går den i et endeløst loop. Nogen der har et bud :-)
Det er bare et gæt. Prøv ellers, at udskrive posterne til skærmen i løkken (evt med en getch-pause, så du kan følge med). Det kan være med til at fortælle dig, hvor det går galt. Du kan også debugge programmet (har du nogensinde prøvet det?).
Hej igen, ja jeg har prøvet at debugge, jeg fandt også fejlen vedr. endeløst loop, men det virker sgu desværre ikke endnu, det er lige som om de forskellige file open metoder måske kludrer hinanden sammen. kunne man oprette to nye fil objekter og bruge dem inde i sin while(!sletpost.eof())
De forskellige file open metoder??? Ifølge min løsning, så åbner du én (sletpost) én gang og lukker den én gang.
Mit forslag skal erstatte hele metoden fra og med "cin>>svar". Det betyder selvfølgelig, at sletpost.close() cirka 4 linier ovenfor skal slettes. Men hvordan ser din metode i grunden ud nu?
Du behøver ikke mere end et fstream-object, men det er selvfølgelig smag og behag (og måske mere overskueligt) om man ønsker to objeker - et som benyttes til at læse og et som benyttes til at skrive - eller et som klarer det hele ;)
Hej ! jeg har her min nuværende funktioen som du forslog, men med lidt ændringer da jeg selfølgelig har prøvet en hel del frem og tilbage. Når en fil skal trunkeres betyder det ikke bare at den skal åbnes i trunc mode så den kan overskrives? void sletdata(void) { int start =0; int startpos =0; int indlaesfra=0;
int i =0;
char svar; ansat medarbejder(navn,efternavn,adresse,telefon,gage,cprnr); fstream sletpost("ansat.dat",ios::in|ios::out); cout <<"skriv navnet paa den person der skal slettes: "<<endl; cin>>navn;
sletpost.seekp(startpos, ios::beg|ios::trunc). Giver ingen mening i mit hovede. Fjern |ios::trunc. Den skal vel bare skrive startpos bytes fra begyndelsen af filen ikke(?) I øvrigt betyder den ingenting (du opnår måske højst at slette din fil med trunc-kommandoen), da du set'er put-pointeren en gang til inden du bruger den, så SLET DEN!
Undskyld, der skulle selvfølgelig i den første linie i while stå: sletpost.seekg(ios::beg, startpos+start), og ikke indlaesfra+start!!!
Og så skal du finde ud af om det skal være "ios::beg, offset" eller "offset, ios::beg", du gør det forskelligt nogle steder, dvs. at nogle af stederne må det være forkert (jeg har bare skrevet det, for jeg kan ikke checke syntaksen her på arbejde).
Som sagt, så er det svært uden compileren, så kontroller for en sikkerheds skyld det jeg skriver.
Hej arbejder som IT-Operatør, men skal starte som system engineer, hos Danka Services int. Den 1 Nov. Jeg arbejder primært med unix, Open Vms, og Open VME Er uddannet Informatik assistent og læser datmatiker fjernundervisning, derfor de mange spørgsmål :-) Hilsen Simon
Øv, jeg kiggede (lidt) på dit program i går aftes, men fik det ikke helt til at køre. Der gik lang tid inden jeg opdagede, at jeg havde glemt at slette linien sletpost.close() :-(
Det mest irriterende er, at jeg faktisk ikke fik det helt til at virke. MEN, jeg har lavet lidt småændringer i programmet og så vidt jeg kan se, kan det godt slette en person (men vist nok ikke den sidste i listen). Problemet er bare at få filen kortet en post af, når alle poster er rykket en plads tilbage (det har jeg faktisk aldrig prøvet og jeg ved ikke lige hvad kommandoen er - jeg forsøgte med "sletpost << EOF;" men det virkede vist ikke).
void sletdata(void) { int start =0; int startpos =0; int indlaesfra=0;
char svar; ansat medarbejder(navn,efternavn,adresse,telefon,gage,cprnr); fstream sletpost("ansat.dat", ios::in|ios::out); cout <<"skriv navnet paa den person der skal slettes: "<<endl; cin>>navn;
startpos += start; } } // Her skal filen trunkeres!!!!!! sletpost.close(); }
void menuitem(void) { cout <<setw(25)<<"Mit person program"<<endl; cout<<endl; cout<<"hvad vil du fortage dig tast 1 eller 2 eller 3"<<endl<<endl; cout <<"1 Indtaste ny person i registret"<<endl; cout <<"2 find en person i registret"<<endl; cout <<"3 Slette en person fra registret"<<endl; cout <<"4 exit"<< endl << endl; cout << "->"; }
void main(void) { int valg;
do { menuitem(); cin>>valg; switch ( valg ){ case 1: { inputdata(); break; } case 2: { soegdata(); break; } case 3: { sletdata(); break; } case 4: return;
Hej Simon - virker det ikke (bortset fra, at den sidste post i filen ikke bliver slettet, når de andre er flyttet)? Lige den detalje kan jeg ikke hjælpe med, for jeg har aldrig brugt den og funktionen findes ikke i min hjælp derhjemme :-( Men resten, er det ikke ok?
Hej Bjarke har været ude på min ny arbejdsplads hele dagen derfor har jeg ikke pt. kigget det, men jeg har lige prøvet og det ser indtil videre ud til at virke, hmmmm vender tilbage når jeg har studeret det lidt grundigere med mange c++ Hilsner Simon
"bjeg vil barwe" - det gik vist lidt hurtigt hva´;-)
Hvis du sender et eksemplar af dit program, som det ser ud cirka klokken 16.30 ( til mailto:d971230@student.dtu.dk ), så er det muligt, at jeg lige kan give det et kig til:-) Men jeg vil ikke love det.
Selvfølgelig må du holde spørgsmålet åbent, men det er jo lidt svært ikke at være lidt emsig med 300 points på højkant ;-)
By the way! Hvis du sender programmet, sender du så ikke også beskrivelsen (fra hjælpen) af metoderne .eof() og .close() og hvis der er andet relevant? Så må vi se om jeg får tid (og kan finde ud af det) til at gøre noget ved det:-)
Det lyder rigtig godt, jeg ´glæder mig faktisk også efterhånden til denne ogave er løst. Når det er sket vil jeg zippe sourcen til sletpost funktioenen og gemme den i en bankboks så jeg er sikker på at den aldrig forsvinder *LOL* nej nej, men jeg glæder mig til qt se hvordan problemmet løses. vedr. trunc af fil så har jeg desværre ikke rigtig nogen ideer
Ja, og så kan du skrive: "Udført af Simon og Bjarke" ;-)
*LOL* ???
Hmm, skidt med det der trunc. Kan du ikke finde noget i forbindelse med ovennævnte metoder, hvis du roder lidt i hjælpen (husker du også at sende det med?)
Hej Bjarke! tusind tak for din hjælp, Jeg har valgt at aflevere opgaven til min lærer, han plejer at sende nogle vejledende løsninger, så den kan jeg jo så sende til dig, så vi kan få styr på det der med de filer *G*
Lyder godt, for den der trunc er jeg altså blevet ret træt af :-( Jeg beklager lidt, for jeg synes ikke, at min hjælp helt er til 300 points, men tak skal du have alligevel (til gengæld har jeg jo så kommenteret lidt på resten af programmet ik';-)
Jeg kan altid bruge konstruktiv kritik, og jeg synes da virkelig din insats er 300 point værd, du har jo engageret dig i problemmet og er jo også næsten nået frem til løsningen ik :-)
Hej soepro, jeg har ikke modtaget en besvarelse fra dig i dette spørgsmål så jeg er ikke helt med påå hvad du mener? men jeg vil da lige checke den funktioen "chsize()" Hilsen Simon
soepro >> hyggeligt at du er tilbage igen - jeg var lige ved at tro, at du havde forladt os (måske opgivet konkurrencen;-)
Synes godt om
Ny brugerNybegynder
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.