29. november 1999 - 09:14Der er
10 kommentarer og 1 løsning
Indlæsning fra .dat i C++
Jeg har en opgave hvor jeg har en .dat fil. Den angiver et navn og to karakterer på 22 personer. Arne 0 0. Bente 3 6. Caroline 9 13. Jeg skal have det læst ind i et array. så jeg bagefter kan bejandle hver fil individulet og rette både i navn og karakter. Det skal være muligt at oprette nye objekter(navne), hvor karakteren bliver sat som default. Programmet skal kun anerkende karaktererne 0,3,5,6,7,8,9,10,11,13 - hvis karakteren er forskellig fra dette skal den sættes til -1. Desuden skal jeg have lavet en skærmudskrift der også angiver gennemsnittet. Jeg har virkelig brug for hurtig hjælp.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Nej selvfølgelig, skal i ikke lave opgaven for mig. Jeg er kommet så langt at jeg har lavet dat-filen. denne indlæser jeg med en ifstream fi ("temp.dat). Men når jeg så skal have denne over i arrays, havde jeg tænkt mig at hver enkelt oplysning skulle have sin egen plads i arrayet. Så Arne stod på plads 0, hans første karakter på plads 1, hans anden karakter på plads 2 etc. Men hvordan for jeg for det første lavet en løkke/loop der læser dataene en for en. Og putter dem ind i den enkelte plads på arrayet.
Prøv at ligge koden/de aktuelle kodestumper op her, så skal jeg prøve at kigge på det.
Du kan ikke gøre det du vil, da et array kun kan indeholde data af en type (medmindre du laver et array af pointere af typen void - men det gør du vist ikke;-). Som sagt vil jeg klart anbefale dig at bruge en struct, men prøv at ligge koden op og lad os se på det du har fået lavet indtil videre...
Det uheldige ligger i at koden ligger derhjemme, og jeg nu sidder på arbejde. Men eftersom jeg er forsinket med opgaven prøver jeg at genkalde hvad jeg har nu. Jeg har forøvrigt glemt at fortælle at det skal bygges ind i en class, men i første omgang vil have det til at virke i almindelig kode, og så bygge en class op.
void mai(){ for (i= 0; i<=30; i++)//løkke til indlæsning i array ifstream fi ("temp.dat"); while (fi.getline) << swtw(9) << navn << setw(2) << kar1 << setw(2) << kar2; array[30] array[i]=navn, array[i]=kar1, array[i]=kar2, i++;// dette går galt, meningen er at navn skal være 9 bred, karakter 1 og 2 skal være 2 bred, disse skal så indlæses i et array. Jeg har dog på fornemmelsen at jeg leder mig ud i noget der ikke kan lade sig gøre. Så men hensyn til struct er jeg åben for forslag.
Har du det skidt med klasser siden du ikke laver det direkte i en klasse?
const int MAX = 20; const int ANTAL = 100;
struct Post { char navn[MAX]; int k1; int k2; };
void main() { Post liste[ANTAL]; // Bør laves med pointere, men i mangel af bedre sikres størrelsen blot vha ANTAL
ifstream fi("temp.dat"); if(!fi) cerr << "Fejlmeddelelse"; // og break, return, exit eller andet
int i=0; while( !fi.eof() && i<ANTAL) { fi >> liste[i].navn; fi >> liste[i].k1; fi >> liste[i].k2; i++; } cout << "\nDer blev indlæst " << i << " poster"; }
Koden er ikke checket, så jeg håber ikke, at jeg har lavet nogle bommerter, men god fornøjelse.
// En struct kanse sådan ud: struct person{ char* navn; char* kar1; char* kar2; } // Der efter laver du en array: person personer[30]; // Og så kan du sætte ind: personer[i].navn=navn; personer[i].kar1=kar1; personer[i].kar2=kar2; // Håber at det kan hjælpe... // /Mads
Mads >> Det er klart smartere med pointere, men udfra det stephansen skriver, så vurderede jeg, at det var bedst at holde sig fra pointere:-) Men selvfølgelig er din løsning "mere rigtig"...
Mange tak for hjælpen. Det kan helt sikkert gøre at jeg får hul på opgaven, så nu vil jeg gå hjem at arbejde med dette i aften. Hvis i har flere fif, er jeg meget åbne for disse. Bl.a. hvordan laver jeg det sådan at man kan gå ind og rette i array'et bagefter. Nej, Jeg har det ikke skidt med class, jeg mener bare at når vi taler så simple programmer er det en unødvendig komplicering. Man kan jo altid lave det om til en class, og så refere til nogle funktioner i main.
Tja, man kan godt sige, at man skyder spurve med kanoner. Men jeg tror, at det er vigtigt, at øve sig i det små. Principielt er det jo også vidt forskelligt at kode classer og almindelig funktioner, selvom det ofte let kan ændres (når vi altså taler om små programmer!!!!).
Hvad vil du rette i arrayet? Er det noget brugeren skal kunne og i givet fald hvordan (altså fra brugerens synspunkt)?
Det skal foregå vha. en switch. Hvor man for en menu. Man vælger hvilket navn man vil rette og så skal programmet kunne finde dette i arrayet. Og rette det til det man skriver i menuen. Jeg er ikke helt sikker på opgave formuleringen, men når jeg kommer hjem og får tid til at kigge på opgaven, vil jeg meget gerne have mulighed for at kontakte jer igen. Endnu engang tak for hjælpen
cout << "Indtast navn på person du vil ændre: "; cin >> navn;
int i=-1; while( liste[i].navn[0]!='\0' ) // Denne metode kræver at ikke brugte navne i listen er nulstillet { i++; if( !strcmp(navn, liste[i].navn) ) // Fundet! Her er posten, og så kan du bare gøre noget ved den (posten er den med index i) : : }
void main() { Post liste[ANTAL]; : : switch( valg ) // eller getch() i stedet for valg { case 'r': ret(&liste); break; case ... default ... } : : }
Det var lidt skabelon - prøv selv at arbejde videre:-)
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.