|
Hum, this can be done using the strtok function (take a look at the doc). But this works with char* and not CString.
Here is an example:
char szString[255];<br />
strcpy(szString,mystring.GetBuffer(254));<br />
<br />
char* token = strtok(szString,",");<br />
while(token)<br />
{<br />
int Value = atoi(token);<br />
token = strtok(NULL,",");<br />
}
And store Value in a table !
Hope this helps!
|
|
|
|
|
Yep, but I'd make a couple of modifications. Use _tcstok() so it supports unicode as well, replace char with TCHAR , and you don't need to call GetBuffer() on the string.
TCHAR szString[255];
_tcscpy(szString,(LPCTSTR)mystring);
TCHAR* token = _tcstok(szString,_T(","));
while(token)
{
int Value = _ttoi(token);
token = _tcstok(NULL,_T(","));
} As long as the string is less than 254 characters long it will work nicely
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Yep! Nice idea
A better solution would to allocate dynamically the string (so retrieve the length of mystring). But this was just an example so it was not perfect !
|
|
|
|
|
cedric moonen wrote:
A better solution would to allocate dynamically the string (so retrieve the length of mystring).
Yeah, but I just thought of an even better way! Let CString do the dirty work for you
CString str = mystring;
TCHAR* token = _tcstok(str.GetBuffer(), _T(","));
while(token)
{
int Value = _ttoi(token);
token = _tcstok(NULL, _T(","));
}
str.ReleaseBuffer();
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Hhhmm, yep, but don't forget that _tcstok will modify the contains of the string !
|
|
|
|
|
cedric moonen wrote:
Hhhmm, yep, but don't forget that _tcstok will modify the contains of the string !
Yeah, which is why I made a copy of it first
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
I think I'm tired !
|
|
|
|
|
cheers Ryan,
works a treat
si
|
|
|
|
|
You're welcome
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Such, an Idea!
int pos=0;
int last=-1;
CString help;
while(pos!=-1)
{
pos=mystring.Find(",",last);
for(int i=last+1;i
|
|
|
|
|
I use the undocumented function AfxExtractSubString() . It's slower than a proper solution, but I haven't had to do time-critical stuff. The function is declared like:
BOOL AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep); rString is the output stringlpszFullString is your input stringiSubString is the number of the substring you want to get (0, 1, 2...)chSep is the separator character, ',' in your case Just do something like this:
CString str;
int i = 0;
while(AfxExtractSubString(str, mystring, i++, _T(',')))
{
} Hope this helps,
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
would it be easier to make it a vector of strings?
*.*
|
|
|
|
|
The program below compiles with no errors and seems to run ok, but it doesn't work properly. When I enter in one of the 13 digit numbers stored in the array, I get back a message saying that the number I input is NOT in the array (but it is). What do I need to change?
Thanks, Dave
-------------------------------------------------------
#include "stdio.h"
#include "math.h"
#include "iostream.h"
#include "stdlib.h"
double values[] = {5758020005287, 7937030006574, 4748020008574,
4847020007584, 9500020004758, 3849573800596 ,5758020005007,
7557030006574, 4745520008574, 4847020005584, 9585520004758,
3849573846696 ,3748596078661 , 4615243374995 , 1115364759770};
int compare (const void * a, const void * b)
{
#define ABS(a) ((a) < 0 ? -(a) : (a) )
double _a = *(double*)a;
double _b = *(double*)b;
if( ABS(_a - _b) < 0.00000001 )
return 0;
else if( _a < _b)
return -1;
else
return 1;
}
int main ()
{
double * pItem;
cout<<"please enter a number"<<endl;
double="" key;
cin="">>key;
pItem = (double*) bsearch (&key, values, 15, sizeof (double), compare);
if (pItem!=NULL)
printf ("%lf is in the array\n",*pItem);
else
printf ("%lf is not in the array\n",key);
return 0;
}
VC++ 6.0
|
|
|
|
|
|
From the documentation:
Performs a binary search of a sorted array.
|
|
|
|
|
Thanks, that did the trick.
|
|
|
|
|
How can I get a list of window handles for a running process?
"It was when I found out I could make mistakes that I knew I was on to something."
-Ornette Coleman
|
|
|
|
|
EnumWindows, EnumChildWindows and GetWindowThreadProcessId
Magnus
|
|
|
|
|
GetWindowThreadProcessID was what I was looking for.
Thanks a lot
"It was when I found out I could make mistakes that I knew I was on to something."
-Ornette Coleman
|
|
|
|
|
This is a pipe-like class written in standard c.Read() and Write()can critically access the inner data section.When there is no data to be read,Read() will block and wait for Write() to write some data to the pipe.Only when
it reads datas does Read() return.
The inner data section are block structures using new operator to calloc units.
/*--------------------------------------------------------
* Pipe.h: interface for the CPipe class.
*
* 2003 DJ Express Studio All rights reserved
*------------------------------------------------------*/
#ifndef _PIPE_H_
#define _PIPE_H_
/* CRITICAL_SECTION was defined in winbase.h
* possibly not compatible with stdafx.h */
#include <Winbase.h>
#define BL_ERROR -1
#define BL_OK 0
struct Block
{
PBYTE pData;
int data_len;
Block* next;
Block* pre;
};
class CPipe
{
private:
CRITICAL_SECTION cs;
HANDLE hEvent;
Block* pBuffer;
Block* pHead;
Block* pTail;
int pointer;
int nBlocks;
public:
void CPipe::EmptyPipe();
int Write(BYTE* buf, int len, int* write);
int Read(BYTE* buf, int len, int* read);
bool IsEmpty();
CPipe()
{
pHead=NULL;
pTail=NULL;
nBlocks=0;
pointer=0;
InitializeCriticalSection(&cs);
hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
};
virtual ~CPipe()
{
CloseHandle(hEvent);
DeleteCriticalSection (&cs);
};
};
#endif
/*---------------------------------------------------
* Pipe.cpp: implementation of the CPipe class.
*
* 2003 DJ Express Studio All rights reserved
*-------------------------------------------------*/
#include "Pipe.h"
int CPipe::Write(BYTE* buf,int len,int* write)
{
Block* pTem;
if(!buf || len <=0 )
goto error;
pTem=NULL;
if(!(pTem=new Block))
goto error;
if(!(pTem->pData=new BYTE[len]))
goto error;
else
{
/* lock the pipe */
EnterCriticalSection(&cs);
pTem->data_len=len;
memcpy(pTem->pData,buf,len);
nBlocks++;
pTem->pre=NULL;
if(pHead==NULL)
pTail=pTem;
else pHead->pre=pTem;
pHead=pTem;
/* unlock the pipe */
LeaveCriticalSection(&cs);
}
*write=len;
SetEvent(hEvent);
return BL_OK;
error:
*write=0;
return BL_ERROR;
}
int CPipe::Read(BYTE* buf,int len,int* read)
{
int total;
Block* tem;
if(!buf || len <= 0 )
goto error;
if( nBlocks <= 0 )
{
WaitForSingleObject(hEvent,INFINITE);
ResetEvent(hEvent);
}
/* lock the pipe */
EnterCriticalSection(&cs);
if(len < pTail->data_len )
{
pointer = len;
memcpy(buf,pTail->pData,len);
*read = len;
}
else
{
total=0;
tem=NULL;
while(len-total)
{
if(len-total >= pTail->data_len )
{
memcpy(buf+total,pTail->pData,pTail->data_len);
total += pTail->data_len;
tem = pTail;
pTail=pTail->pre;
pointer = 0;
delete []tem->pData;
delete tem;
}
else
{
memcpy(buf+total,pTail->pData,len-total);
total = len;
pointer = len - total;
break;
}
if(--nBlocks <= 0)
{
pTail=NULL;
pHead=NULL;
break;
}
}
*read = total;
}
/* unlock the pipe */
LeaveCriticalSection(&cs);
return BL_OK;
error:
*read=0;
return BL_ERROR;
}
bool CPipe::IsEmpty()
{
return nBlocks > 0 ? false : true ;
}
void CPipe::EmptyPipe()
{
Block* tem;
if(nBlocks <= 0)
return;
/* lock the pipe */
EnterCriticalSection(&cs);
while(nBlocks--)
{
tem=pTail;
pTail=pTail->pre;
delete []tem->pData;
delete tem;
tem=NULL;
}
pHead=pTail=NULL;
/* unlock the pipe */
LeaveCriticalSection(&cs);
}
/*---------------------------------------------------------*/
|
|
|
|
|
hi,
i have a program written that reads a flat text tab separated file using ODBC ,the database
contains various number and text columns.Using VC++ classwizard, i created my CRecordset derived class and the type of member-variables corresponding to the text columns is CString .My problem is that i am able to connect and open the database and fetch all the records i want by fetching the recordsets in loop, but i couldn't read all but first text columns and when i try to read them ,it gives exception.All other columns of type number are read correctly for all records.Surprisingly the first text column field is also read correctly but the subsequent fields are not.
While debugging ,when i see the value of these string member-variables of the recordset ,it says CXX0033:ERROR: error in OMF type information.
Can anybody give some suggestions.
|
|
|
|
|
|
Simply wait. Be sure that if someone has a solution, it will post it here. But do not be too insistant, this usually is the best way to get no answer.
~RaGE();
|
|
|
|
|
Hi,
In a dialog based application, i have a AfxBeginThread function
to write some data to make a multi-session CD.
between the first session and the second session i need the thread wait a some seconds until the lead-out of first session be written.
Anyone can point me which wait function is useful for this purpose? For example,
Sleep(100); or
WaitForSingleObject(pThread->m_hThread, 100)
or others.
Thanks in advance!
chen
|
|
|
|
|
If you just want to wait a number of seconds, use Sleep
If you want to wait on an event that is triggered from another thread, use CreateEvent and then WaitForSingleObject.
If you want to wait on another thread to finnish use WaitForSingleObject(pThread->m_hThread, INFINITE)
Magnus
|
|
|
|
|