|
You want to use iostreams. There are several articles in the STL section which show you how.
Essentially:
#include <iostream>
using std::ofstream;
using std::endl;
int main()
{
ofstream file("c:\\MyFile.txt");
file << count << endl;
for (int i = 0; i < count; ++i)
{
file << customer[i].surname << endl;
file << customer[i].firstname << endl;
file << customer[i].whatever << endl;
}
file.close();
}
I have an article on how you could write a handler to stream the customer struct all in one go as well.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
<i>And you don't spend much time with the opposite sex working day and night, unless the pizza delivery person happens to be young, cute, single and female. I can assure you, I've consumed more than a programmer's allotment of pizza, and these conditions have never aligned.</i> - <b>Christopher Duncan - 18/04/2002</b>
|
|
|
|
|
Hi all,
Just wondering, after subclassing a combo-box or list-box,
What is the trick for painting a bmp as background on which
to write our text?
Making a more exciting control,
Thanks!
Orlanda
Coding is a family business
|
|
|
|
|
Never done it, but i'd try implementing a handler for WM_ERASEBKGND (MFC OnEraseBkgnd() and drawing the bitmap to the provided device context.
--------
all the modern things
have always existed
they've just been waiting
to come out
and multiply
and take over Björk, The Modern Things
|
|
|
|
|
hi,
Could you detail your explanation?
I grasp your idea.
Just that I'm kinda new to MFC...
Thanks!
Orlanda
Coding is a family business
|
|
|
|
|
Alright, so you've got this custom listbox class... Add a member variable of type HBITMAP . Call it m_pbmpPattern . Initialize it to NULL . Add the line ON_WM_ERASEBKGND() to it's message map. Add the function BOOL OnEraseBkgnd(CDC* pDC) to the class. Use this code for the implementation:
BOOL CMyListBox::OnEraseBkgnd(CDC* pDC)
{
CRect rectClient;
GetClientRect(&rectClient);
if ( NULL == m_pbmpPattern )
m_pbmpPattern = static_cast<HBITMAP>(::LoadImage(AfxGetResourceHandle(),
MAKEINTRESOURCE(IDB_BACKGROUND), IMAGE_BITMAP, 0,0, LR_SHARED));
if ( NULL == m_pbmpPattern )
return FALSE;
CDC dcPat;
dcPat.CreateCompatibleDC(pDC);
CBitmap* pbmpOld = dcPat.SelectObject(m_pbmpPattern);
BITMAP bitmap;
if ( m_pbmpPattern->GetBitmap(&bitmap) && bitmap.bmWidth > 0 && bitmap.bmHeight > 0 )
{
for (int y=0; y<rectClient.bottom+bitmap.bmHeight; y += bitmap.bmHeight)
{
for (int x=0; x<rectClient.right+bitmap.bmWidth; x += bitmap.bmWidth)
{
pDC->BitBlt(x,y, bitmap.bmWidth, bitmap.bmHeight, &dcPat, 0,0, SRCCOPY);
}
}
}
dcPat.SelectObject(pbmpOld);
return TRUE;
} Note, this is not the best way of accomplishing this; but it is a start. Read the articles on writing custom controls here at CP to get a better grip of the basics.
--------
all the modern things
have always existed
they've just been waiting
to come out
and multiply
and take over Björk, The Modern Things
|
|
|
|
|
Hey Guys
Just a quick question about good programming practice should i delete all variables i use in a function and program or just deallocate memory i have pointed to an initalise the pointers to null and let the rest be deallocated when the function/program drops out.
Peter
|
|
|
|
|
What do you mean by "deleting variables" in opposition to "deallocating memory"?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
delete everything you allocate. don't let the lazy people tell you different.
-c
<font size=-2>
o(int O){putchar(O);}main(){float _[8],O,I=.05;char l;for(_[6]=15;_[6]<':';o
(10),_[5]=-'$'*I+_[6]++*I)for(_[7]=-5;_[7]<'@';_[4]=-'('*I+_[7]++*I,o(l?'?':':'))
for(*_=O=0,l=1;++l&&((_[2]=*_**_)+(_[3]=O*O)<4);O=*_*O+_[5]+O**_,*_=_[2]-_[3]+_[4]);}</font>
|
|
|
|
|
Cheers Chris thats what i needed to know
Peter
|
|
|
|
|
Chris, the way I read his question, he knows to delete pointers, but wants to try and delete variables where he has not allocated any memory dynamically.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
And you don't spend much time with the opposite sex working day and night, unless the pizza delivery person happens to be young, cute, single and female. I can assure you, I've consumed more than a programmer's allotment of pizza, and these conditions have never aligned. - Christopher Duncan - 18/04/2002
|
|
|
|
|
sure. but i did say "delete everything you allocate". which excludes things he didn't allocate. i suppose i'm assuming he knows that "allocate" means "things you had to use 'new', 'malloc', 'GlobalAlloc' and friends to get".
maybe i'm wrong. i hope so. i'd like to see what it's like.
-c
<font size=-2>
o(int O){putchar(O);}main(){float _[8],O,I=.05;char l;for(_[6]=15;_[6]<':';o
(10),_[5]=-'$'*I+_[6]++*I)for(_[7]=-5;_[7]<'@';_[4]=-'('*I+_[7]++*I,o(l?'?':':'))
for(*_=O=0,l=1;++l&&((_[2]=*_**_)+(_[3]=O*O)<4);O=*_*O+_[5]+O**_,*_=_[2]-_[3]+_[4]);}</font>
|
|
|
|
|
Chris Losinger wrote:
maybe i'm wrong. i hope so. i'd like to see what it's like.
*grin*
Well, I'd just presume that someone who asks if they need to delete something they did not allocate probably won't understand what 'allocate' means.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
And you don't spend much time with the opposite sex working day and night, unless the pizza delivery person happens to be young, cute, single and female. I can assure you, I've consumed more than a programmer's allotment of pizza, and these conditions have never aligned. - Christopher Duncan - 18/04/2002
|
|
|
|
|
You can only delete the variables you initialised in pointers. This won't work:
int i;
i = 0;
ExternalFunction(i);
delete i; // WONT WORK !!!
non pointers are deleted for you when they go out of scope.
Christian
The tragedy of cyberspace - that so much can travel so far, and yet mean so little.
And you don't spend much time with the opposite sex working day and night, unless the pizza delivery person happens to be young, cute, single and female. I can assure you, I've consumed more than a programmer's allotment of pizza, and these conditions have never aligned. - Christopher Duncan - 18/04/2002
|
|
|
|
|
Ah okay
Thats even better, so basically delete anything that is a pointer otherwise if it is just a variable inistialised on the stack i leave it to go out of scope
Peter
|
|
|
|
|
Right i just read Chris Losinger second post and fully get it now in which case i have doen the right thing cause i already deallocted all pointers. The biggest thing was i basically have structures initalised not allocated and was wondering if they needed deleting but obviously since they are initialized and not allocated i just leave them to go out of scope.
I have one other question though my structure contains pointers at the moment i am doing delete[] on the pointers in teh structure and then settign the pointer to null and letting the rest go out of scope. Is this the right thing to do?
Peter
|
|
|
|
|
"delete [] ptr;" when you allocate an array (CString *ptr = new CString[100]). otherwise use "delete ptr;".
-c
<font size=-2>
o(int O){putchar(O);}main(){float _[8],O,I=.05;char l;for(_[6]=15;_[6]<':';o
(10),_[5]=-'$'*I+_[6]++*I)for(_[7]=-5;_[7]<'@';_[4]=-'('*I+_[7]++*I,o(l?'?':':'))
for(*_=O=0,l=1;++l&&((_[2]=*_**_)+(_[3]=O*O)<4);O=*_*O+_[5]+O**_,*_=_[2]-_[3]+_[4]);}</font>
|
|
|
|
|
I'm trying to optimize a function. I have an implementation in a static library that i'm using as a reference and another built into my app that i'm working on. I'm not recompiling the static lib, just linking to it.
The test code looks like this:
dwStart = GetTickCount();
for (z=0;z<reps;z++)
{
Fn(params);
}
dwStop = GetTickCount();
Trial 1:
compiled in release mode with "Max Speed" optimizations
run 1000 reps of each over the same data set
New implementation : 2.45 sec
Reference implementation : 6.41 sec
So, I'm doing good. I've halved the speed of the reference.
Trial 2:
compiled in release mode with "Default" optimizations
run 1000 reps of each over the same data set
New implementation : 3.45 sec
Reference implementation : 5.70 sec
So, as expected, the new function is slower without the max-speed optimizations. but, the reference implementation, the one in the static libs that i'm not recompiling has gotten faster when i changed optimization settings. Errrr... WTF??
any ideas?
-c
<font size=-2>
o(int O){putchar(O);}main(){float l[8],O,I=.05;char _;for(l[6]=15;l[6]<':';o
(10),l[5]=-'$'*I+l[6]++*I)for(l[7]=-5;l[7]<'@';l[4]=-'('*I+l[7]++*I,o(_?'?':':'))for
(*l=O=0,_=1;++_&&((l[2]=*l**l)+(l[3]=O*O)<4);O=*l*O+l[5]+O**l,*l=l[2]-l[3]+l[4]);}</font>
|
|
|
|
|
Chris Losinger wrote:
the one in the static libs that i'm not recompiling has gotten faster
Did you reboot in between tests? I always do that, to make sure all caches are emptied. For example, the 6.41s run might have read data from disk, which was then cached when subsequent tests ran, resulting in the 5.7s time later.
--Mike--
Buy me stuff!
Like the Google toolbar? Then check out UltraBar, with more features & customizable search engines!
My really out-of-date homepage
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
nope. if i switch back to the max speed optimizations, it goes back to the first set of numbers. it's consistent.
-c
<font size=-2>
o(int O){putchar(O);}main(){float l[8],O,I=.05;char _;for(l[6]=15;l[6]<':';o
(10),l[5]=-'$'*I+l[6]++*I)for(l[7]=-5;l[7]<'@';l[4]=-'('*I+l[7]++*I,o(_?'?':':'))for
(*l=O=0,_=1;++_&&((l[2]=*l**l)+(l[3]=O*O)<4);O=*l*O+l[5]+O**l,*l=l[2]-l[3]+l[4]);}</font>
|
|
|
|
|
It's hard to know without more info about that Fn function and the parms it is accepting. Change the static lib implementation to a do-nothing function, so that you will be basically measuring the cost of doing the function call --maybe this sheds some light on the problem.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
FYI, here are the parameters:
<br />
void FnNew(const BYTE *pIn, const int inW, const int inH, BYTE *pOut, const int outW, const int outH, const int bpp)<br />
the static lib function has essentially the same params, except that they aren't "const" - they are treated as const, but not labelled as such. i tested this angle and got the same results, const or not.
-c
<font size=-2>
o(int O){putchar(O);}main(){float _[8],O,I=.05;char l;for(_[6]=15;_[6]<':';o
(10),_[5]=-'$'*I+_[6]++*I)for(_[7]=-5;_[7]<'@';_[4]=-'('*I+_[7]++*I,o(l?'?':':'))
for(*_=O=0,l=1;++l&&((_[2]=*_**_)+(_[3]=O*O)<4);O=*_*O+_[5]+O**_,*_=_[2]-_[3]+_[4]);}</font>
|
|
|
|
|
What happens if you replace the static lib "i.e. the reference" implementation with a do-nothing function? Still having worse results in "Max speed"?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
actually, no.
i had to make a new static lib to test this (don't have the source to the other lib with me). but, the do-nothing function with 100000000 reps takes the same amount of time regardless of how the calling app is optimized.
hmm.
-c
<font size=-2>
o(int O){putchar(O);}main(){float _[8],O,I=.05;char l;for(_[6]=15;_[6]<':';o
(10),_[5]=-'$'*I+_[6]++*I)for(_[7]=-5;_[7]<'@';_[4]=-'('*I+_[7]++*I,o(l?'?':':'))
for(*_=O=0,l=1;++l&&((_[2]=*_**_)+(_[3]=O*O)<4);O=*_*O+_[5]+O**_,*_=_[2]-_[3]+_[4]);}</font>
|
|
|
|
|
Maybe I didn't made myself clear enough... I'm asumming the do-nothing function still accepts the whole lot of parameters (even though it does nothing with them), right?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
yes. it's the same function signature - just nothing in the function.
-c
<font size=-2>
o(int O){putchar(O);}main(){float _[8],O,I=.05;char l;for(_[6]=15;_[6]<':';o
(10),_[5]=-'$'*I+_[6]++*I)for(_[7]=-5;_[7]<'@';_[4]=-'('*I+_[7]++*I,o(l?'?':':'))
for(*_=O=0,l=1;++l&&((_[2]=*_**_)+(_[3]=O*O)<4);O=*_*O+_[5]+O**_,*_=_[2]-_[3]+_[4]);}</font>
|
|
|
|
|