file output.

Status
Niet open voor verdere reacties.

CanTBeaTme

Banned
Lid geworden
25 jul 2006
Berichten
235
ik heb 2 class files gemaakt die inheratance delen met elkaar, en ik sla 50 van deze blank accounts op in een file, nu heb ik een writer gemaakt die dus binair in die file de classes "vult" en dit werkt wel voor de eerste class (base class) maar zosnel als ik hem de 2de class probeer te laten lezen lukt het niet meer:

hieronder de code die de file moet uitlezen
Code:
     case 3:
     {
       cout <<"View all the registered clients:"<<endl;
       baseclass basicclient;
       dirclass  advancedclient;


       ifstream file ("clients.dat",ios::in | ios::binary );

       file.read (reinterpret_cast < char * > (&basicclient),
       sizeof (baseclass));
       while (basicclient.getID () <= 51)
       {
         outputline (cout,basicclient);


         file.read (reinterpret_cast < char * > (&basicclient),
         sizeof (baseclass));
       }
       cout <<"\n\n-----------READ FIRST 50 BASIC ACCOUNTS------------\n\n";


       file.read (reinterpret_cast <char *> (&advancedclient),
       sizeof (dirclass));
       while (advancedclient.getID() <= 102)
       {
         Outputline (cout,advancedclient);



         file.read (reinterpret_cast <char *> (&advancedclient),
         sizeof (dirclass));
       }
       cout <<"_____________________________________________________";
       cout <<"\n\n\n\n"<<endl;

       printmainoptions();
       choise = getchoise();
     } break;
hieronder de aangeroepen functies die het moetten uitprinten
Code:
void outputline (ostream &output,baseclass &lol )
{
  output <<left<<setw(5)<<lol.getID()
         <<setw(15)<<lol.getfname()
         <<setw(15)<<lol.getlname()
         <<"\n"<<setw(7)<<lol.getsex()
         <<setw(2)<<lol.getage()<<"\n"
         <<setw(40)<<lol.getwoonplaats()<<"\n"<<endl;
}
void Outputline (ostream &output,dirclass &loll)
{
  output <<left<<setw(5)<<loll.getID()
         <<setw(15)<<loll.getfname()
         <<setw(15)<<loll.getlname()
         <<"\n"<<setw(7)<<loll.getsex()
         <<setw(2)<<loll.getage()
         <<setw(8)<<loll.getsalary()<<"\n"
         <<setw(40)<<loll.getwoonplaats()<<"\n"
         <<setw(100)<<loll.raboutyourself()<<endl;


}
hieronder de output (van de eerste 50 accounts van type baseclass is alles Ok
maar dan komt die aan de inheritance class dirclass en die wil ie niet juist uitlezen

1

3 0

not given



2

3 0

not given



2 sven vranken

1 16

not given



4

3 0

not given



5

3 0

not given



6

3 0

not given



7

3 0

not given



8

3 0

not given



9

3 0

not given



10

3 0

not given



11

3 0

not given



12

3 0

not given



13

3 0

not given



14

3 0

not given



15

3 0

not given



16

3 0

not given



17

3 0

not given



18

3 0

not given



19

3 0

not given



20

3 0

not given



21

3 0

not given



22

3 0

not given



23

3 0

not given



24

3 0

not given



25

3 0

not given



26

3 0

not given



27

3 0

not given



28

3 0

not given



29

3 0

not given



30

3 0

not given



31

3 0

not given



32

3 0

not given



33

3 0

not given



34

3 0

not given



35

3 0

not given



36

3 0

not given



37

3 0

not given



38

3 0

not given



39

3 0

not given



40

3 0

not given



41

3 0

not given



42

3 0

not given



43

3 0

not given



44

3 0

not given



45

3 0

not given



46

3 0

not given



47

3 0

not given



48

3 0

not given



49

3 0

not given



50

3 0

not given



51

3 0

not given







-----------READ FIRST 50 BASIC ACCOUNTS------------



0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

445881212445161.78829e-307





0 sD

0 0 1.45453e-319





_____________________________________________________

voor diegene die er wat dieper in willen kijken: (tzal wrsl wel nodig zijn :P )
hier is de volledige source+headers:
 

Bijlagen

Laatst bewerkt door een moderator:
nou heb ik ie al zover gekregen dat hij de eerste dirclass juist print maar de rest...

stuk dat ik heb aangepast:

Code:
[CODE]advancedclient.setID(52);
Code:
file.seekg ( (advancedclient.getID())*sizeof (dirclass));
for (int x = advancedclient.getID(); x<=102; ++x)
{
Code:
advancedclient.setID(x);

Outputline (cout,advancedclient);




file.read (reinterpret_cast <char *> (&advancedclient),
sizeof (dirclass));

}
cout <<"_____________________________________________________";
cout <<"\n\n\n\n"<<endl;[/CODE]


kep hem nou ook al zover gekregen dat hij de ID's van de volgende dirclass accounts ook leest:

Code:
52

3 0 0



//dit is de juiste uitput (including spaties;)

Code:
53
 ú

0 20803747845.00578e-247

€|

~e‘|
 
heb nog niet naar je code gekeken, en heb wegens project deze week spijtig genoeg geen tijd...

In elk geval zag ik zonet dat je file.seekg() gebruikt, wat om de een of andere reden problemen geeft als je in die stream als eens een EOF-karakter bent tegengekomen... mss moet je de tweede file met een nieuwe stream proberen openen.

--Johan
 
als je er misschien later nog eens wilt inkijken zal ik de nieuwe source hier neerzetten, kep namelijk nog wat kleine foutjes gevonden
 

Bijlagen

Heb er nog even naar gekeken, een include van een '.cpp' is geen goed idee, omdat het samenbrengen van de .cpp-files via de linker gebeurt.

Als je gewone functies schrijft (ook al is het met declaratie), dus geen klasse-implementaties, gebruik je best ook een header-file. Als je wil kan je een header-file maken met alle functiedefinities in, en een cpp-file met de outline declaratie, en dan de header-file include in je main.cpp.

Of je kan gewoon van de hele file een header maken. Als je Mainfunctions.cpp hernoemt naar mainfunctions.h en het include-statement in de mainfile aanpast, krijg je geen compilatie-errors meer. Vergeet dan ook niet om een #ifndef toe te voegen!

Op de werking heb ik nog niet getest, maar dat zal ik in de loop van deze week nog wel eens doen.

--Johan
 
nou met het compilen lukt het wel hoor er zit erges een logischtieke error in. maar ik zal de includes wat verminderen en opschonen nu :)
 
ik heb het gevonden , eindelijk na uren van werk. de fout is echt heel dom, om diegene die met eenzelfde soort van probleem zouden zitten of ooit gaan zitten ga ik nu uitleggen wat de fout is en hoe ik hem heb opgelost.

Code:
     case 3:
     {
       cout <<"View all the registered clients:"<<endl;
       baseclass basicclient;
       dirclass  advancedclient;



       ifstream file ("clients.dat",ios::in | ios::binary );

       file.read (reinterpret_cast < char * > (&basicclient),
       sizeof (baseclass));
       while (basicclient.getID () <= 51)
       {
         outputline (cout,basicclient);


         file.read (reinterpret_cast < char * > (&basicclient),
         sizeof (baseclass));
       }
       cout <<"\n\n-----------READ FIRST 50 BASIC ACCOUNTS------------\n\n";
       file.close();
       ifstream File ("clients.dat",ios::in | ios::binary );
       advancedclient.setID(52);
      [B] File.seekg ( (advancedclient.getID()-1)*sizeof (baseclass));[/B]
       for  (int x = advancedclient.getID(); x<=102; ++x)
       {

         advancedclient.setID(x);


         Outputline (cout,advancedclient);




         File.read (reinterpret_cast <char *> (&advancedclient),
         sizeof (dirclass));





       }

nou , daar zie je hem, de aanpassing die ik heb gedaan om het juist te laten uitlezen.

File.seekg ( (advancedclient.getID()-1)*sizeof (baseclass));
en wat ik eerst had was:
File.seekg ( (advancedclient.getID())*sizeof (dirclass));

nou weet ik dat mijn oplossing logisch is, ik zet de file pointer (waar ie moet beginnen met lezen op het einde van baseclass met ID 51. : advancedclient.getID()-1 geeft de baseclass met ID 51 en sizeof baseclass zegt hem het aantal bytes dat hij moet vooruitgaan (dus 1 baseclass verder gaan) wat dus de pointer op de eerste byte zet van de eerste advancedclient (dirclass).!

maar doet "File.seekg ( (advancedclient.getID())*sizeof (dirclass));"
niet hetzelfde?
dit is nu mijn nieuwe vraag :) :D maar ik zet de status alvast op opgelost
 
nou is et m weer gelukt dat ik eenzelfde soort van fout ook nog in de write sectie heb zitten, alleen die krijg ik er dus zelf niet uit...

hier efjes de code+redenering:
Code:
[B]writeinfo.seekp ( (advancedclient.getID()-1) *
          sizeof (dirclass));[/B]

          writeinfo.write (reinterpret_cast < const char * > ( &advancedclient),
          sizeof (dirclass));

dit is de code met de fout in :
writeinfo.seekp ( (advancedclient.getID()-1) *sizeof (dirclass));

de gebruiker heeft dus zijn data ingevult en deze is klaar om naar de file geschreven te worden, maar de code hierboven zal het id opzoeken met sprongen van de grootte van "dirclass" maar de eerste 50 records in die file zijn van de grootte "baseclass"!!!! dus dit werkt niet! heb ik het dus zo geprobeerd dat ik mijn filepointer naar het laatste record van de "baseclass" zet, dus de baseclass met id nummer 50, en vanaf daar doorspring met grote van dirclass:

Code:
          baseclass basicclient;
          basicclient.setID(51);

          writeinfo.seekp ( (basicclient.getID()) *
          sizeof ( baseclass)) ;

          writeinfo.seekp ( (advancedclient.getID()-1) *
          sizeof (dirclass));

maar dit lukt dus niet, hoe moet ik dit doen? mijn gedachte zal wel juist zijn, maar in de code zal wel een fout zitten
 
Code:
          baseclass basicclient;
          basicclient.setID(51);

          writeinfo.seekp ( (basicclient.getID()) *
          sizeof ( baseclass)) ;

          writeinfo.seekp ( (advancedclient.getID()-1) *
          sizeof (dirclass));

maar dit lukt dus niet, hoe moet ik dit doen? mijn gedachte zal wel juist zijn, maar in de code zal wel een fout zitten

Mss eerst nog het ID van advancedclient setten, anders kan je't niet ophalen natuurlijk :cool:
Code:
          baseclass basicclient;
          basicclient.setID(51);

          writeinfo.seekp ( (basicclient.getID()) *
          sizeof ( baseclass)) ;

[B]dirclass advancedclient;
advancedclient.setID(52);[/B]

          writeinfo.seekp ( (advancedclient.getID()-1) *
          sizeof (dirclass));

--Johan
 
staat ie nog op 52 voor je writeloop ook? want in de readloop verhoogt ie tot 102 eh.

En ik die dacht dat ik je eruit had gelpoen *snifje* :p
 
nou , voor te lezen doei k het met een loop (lees ze allemaal) maar schrijven gaat per id, hij vraagt eentje op en schrijft dan naar die ID, maar ik heb het op een ander forum eens gevraagt, naar het schijnt zou dat schrijven niet zo simpel zijn, dus heb ik het erbij gelaten ze in aparte files te schrijven.

Wel spijtig dat ik er zoveel tijd aan verdaan heb om eigenlijk iets te proberen wat ik nog niet kan :)
 
Als je ooit ontdekt dat je't wel kan, ik ben wel geïnteresseerd in de oplossing ervan ;)
 
als ik trug met file i/o bezig ben en ik vind de oplossing zal ik hem hier zeker voor je posten :P
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan