[c++]wegschrijven vector naar bestand

Pagina: 1
Acties:

  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 01:11

Beyond

Dussssss.......

Topicstarter
Hallo,

Ik heb een vector van objecten en die objecten probeer ik nu in een bestand weg te schrijven, maar hij schrijft maar 1 letter weg ipv de hele CString.

Dialoog:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void CDialoogAdresToevoegen::OnOK() 
{
    //Uitlezen textfield
    GetDlgItemText(IDC_TF_NAAM,m_Voornaam);
    GetDlgItemText(IDC_TF_ADRES,m_Adres);
    GetDlgItemText(IDC_TF_POSTCODE,m_Postcode);
    GetDlgItemText(IDC_TF_PLAATS,m_Plaats);

    //pGegevens is een pointer van het type CAdresgegevens
    CAdresgegevens * pGegevens;
    pGegevens = new CAdresgegevens(m_Voornaam,m_Adres,m_Postcode,m_Plaats);

    //Koppeling naar mainwindow
    CMainWindow * pFrame = (CMainWindow*)AfxGetMainWnd();
    //Doorgeven aan de hoofdclass
    pFrame->AddToAdresVector(pGegevens);
    
    
    CDialog::OnOK();
}


C++:
1
2
3
4
5
6
7
8
9
10
11
12
void CMainWindow::AddToAdresVector (CAdresgegevens * pAdresgegevens) 
{ 
    //adres->getAdres() is gelijk aan (*adres).getAdres()
    MessageBox(pAdresgegevens->getAdres());
    
    //Toevoegen aan vector ---> De inhoud van de pointer (*pAdresgegevens)
    adresVector.push_back(*pAdresgegevens);

    //Vector uitlezen kan zo: Dit gaat goed.
    MessageBox(adresVector.at(0).getPostcode());
      
}


Nu wil ik dus die vector doorlopen en naar een bestand wegschrijven:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CMainWindow::OnMenuItemOpslaan()
{
    fstream iofile("output.txt", ios::in | ios::out |ios::ate);
    if (!iofile.fail()) { // Put whatever you need to generate new lines here
        
        for (int i = 1; i <= 3; i++ ) {
            CString postcode = adresVector.at(0).getPostcode();
            iofile << "Naam: " << *postcode << " at end" << endl;       
        }

    }
    else {
        MessageBox("Fout met openen uitvoerbestand!");
      
    }

}


Adresgegevens:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAdresgegevens::CAdresgegevens(CString voornaam,CString adres, CString postcode, CString plaats )
    :_voornaam(voornaam),_adres(adres),_postcode(postcode), _plaats(plaats)
{

}

CString CAdresgegevens::getVoornaam()
{
    return _voornaam;
}

CString CAdresgegevens::getAdres()
{
    return _adres;
}

CString CAdresgegevens::getPostcode()
{
    return _postcode;
}

CString CAdresgegevens::getPlaats()
{
    return _plaats;
}


CAdresgegevens::~CAdresgegevens()
{

}


Nu schrijft hij dus alleen de eerste karakter van de postcode weg en niet de hele postcode.
Iemand een idee?

Al het goeie.......


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Ik denk dat je niet *Postcode moet gebruiken want dant maakt ie denk ik gebruik van de index operator [] die een char teruggeeft.

Probeer het eens met Postcode, die dan een const char* operator gebruikt van CString.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 01:11

Beyond

Dussssss.......

Topicstarter
Hij schrijft nu : 00422D7C weg en dat is het adres neem ik aan.

Geprobeerd:

C++:
1
2
CString postcode = adresVector.at(0).getPostcode();
iofile << "Naam: " << postcode << " at end" << endl;


i.p.v

C++:
1
2
CString postcode = adresVector.at(0).getPostcode();
iofile << "Naam: " << *postcode << " at end" << endl;

[ Voor 67% gewijzigd door Beyond op 20-06-2005 14:42 ]

Al het goeie.......


  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 01:11

Beyond

Dussssss.......

Topicstarter
Thnx

C++:
1
const char* postcode = adresVector.at(0).getPostcode();

Al het goeie.......


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Je kunt ook de << overloaden voor CString trouwens, met een global operator functie. Zie bv hier:

http://www.technology.nia...c1435/notes/overload.html

En dan nog iets, je kunt objecten beter als const ref meegeven als je ze alleen wilt gebruiken om te kopieren, zoals je in je constructor doet, dat scheelt een copy constructor aanroep die mogelijk veel overhead met zich meebrengt.

[ Voor 15% gewijzigd door farlane op 20-06-2005 15:23 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Je hebt een memory leak.
C++:
1
2
    CAdresgegevens * pGegevens;
    pGegevens = new CAdresgegevens(m_Voornaam,m_Adres,m_Postcode,m_Plaats);

is overbodig. Je bedoelt gewoon
C++:
1
    CAdresgegevens Gegevens( m_Voornaam,m_Adres,m_Postcode,m_Plaats);

Vervolgens verander je de signature van AddToAdresVector naar CAdresgegevens const&.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 01:11

Beyond

Dussssss.......

Topicstarter
MSalters schreef op maandag 20 juni 2005 @ 15:35:
Vervolgens verander je de signature van AddToAdresVector naar CAdresgegevens const&.
Dit snap ik niet helemaal.
Hoe kan ik dat doen?

mijn h file:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <vector>

class CMyApp : public CWinApp
{

public:
    virtual BOOL InitInstance ();

};

class CMainWindow : public CFrameWnd
{


public:    
    CMainWindow ();
    void AddToAdresVector (CAdresgegevens * adres);
    
    std::vector<CAdresgegevens> adresVector;
    
    
private:
    
    
    
protected:  
    afx_msg void OnMenuItemInfoOver();
    afx_msg void OnMenuItemBestandToevoegen();
    afx_msg void OnMenuItemOpslaan();
    DECLARE_MESSAGE_MAP ()
};


en

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Adresgegevens.h: interface for the CAdresgegevens class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ADRESGEGEVENS_H__7AD0933A_8C28_481E_B693_994841570973__INCLUDED_)
#define AFX_ADRESGEGEVENS_H__7AD0933A_8C28_481E_B693_994841570973__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CAdresgegevens  
{
public: 
    CAdresgegevens(CString voornaam,CString adres, CString postcode, CString plaats);
    virtual ~CAdresgegevens();

    afx_msg CString getVoornaam();
    afx_msg CString getAdres();
    afx_msg CString getPostcode();
    afx_msg CString getPlaats();

private:
    CString _voornaam;
    CString _adres;
    CString _postcode;
    CString _plaats;
};

#endif // !defined(AFX_ADRESGEGEVENS_H__7AD0933A_8C28_481E_B693_994841570973__INCLUDED_)

[ Voor 90% gewijzigd door Beyond op 20-06-2005 16:32 ]

Al het goeie.......


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Als rechtgeaarde C++ vindt MSalters (terecht) dat je niet met pointers/new/delete moet gaan pielen als het niet nodig is.

Je kunt de vector het memory management laten doen door gewoon stack objecten in je vector te plaatsten. Deze maakt er een kopie van en doet het memory management voor je. Het voorbeeld van MSalters maakt daar gebruik van.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 01:11

Beyond

Dussssss.......

Topicstarter
Ok maar wat moet ik in mijn code daar allemaal voor aanpassen?

als ik gebruik maak van:

C++:
1
CAdresgegevens Gegevens( m_Voornaam,m_Adres,m_Postcode,m_Plaats);

[ Voor 49% gewijzigd door Beyond op 20-06-2005 16:43 ]

Al het goeie.......


  • jos707
  • Registratie: December 2000
  • Laatst online: 04-05 14:12
Volgens mij kan je gewoon dit doen:

C++:
1
pFrame->AddToAdresVector(CAdresgegevens Gegevens( m_Voornaam,m_Adres,m_Postcode,m_Plaats));

Verwijderd

Heb je al geprobeerd om de null-terminated C string in die stream te gooien?

zo:
C++:
1
iofile << (LPCTSTR)(*postcode);


Ik weet uit m'n hoofd niet precies hoe die fstream werkt, maar ik dacht dat dit wel moet kunnen....

  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 01:11

Beyond

Dussssss.......

Topicstarter
Het werkt wel alleen ben ik benieuwd wat MSalters precies bedoelt en wat ik daarvoor allemaal moet aanpassen

Al het goeie.......


Verwijderd

Beyond schreef op maandag 20 juni 2005 @ 17:27:
Het werkt wel alleen ben ik benieuwd wat MSalters precies bedoelt en wat ik daarvoor allemaal moet aanpassen
Hij zegt twee dingen:
  1. als je 'new' t moet je ook ergens 'delete' en
    dat kun je doen door bijv. in de destuctor van (volgens mij) CMainWindow over de vector te loopen en de pointers te deleten
  2. het eerste hoeft niet als je geen pointers opslaat in de vector maar gewoon kopieen. Maar de functie AddToAdresVector(CAdresGegevens*) moet dan veranderen naar: AddToAdresVector(const CAdresGegevens&)

  • Beyond
  • Registratie: Juni 2001
  • Laatst online: 01:11

Beyond

Dussssss.......

Topicstarter
zal er naar kijken

[ Voor 119% gewijzigd door Beyond op 20-06-2005 22:23 ]

Al het goeie.......

Pagina: 1