Click to See Complete Forum and Search --> : Function to find special String


Sophie
June 22nd, 1999, 07:49 AM
I need a function that will search a file byte by byte until it reaches a special string "<!--$$(" when this is found it will extract what it is found until it reaches the ")". There will be more than just a once occurence of that special string.

Does anyone have an exampple of something similar or could someone point me in the right direction. I was hoping to use something like Mid from VB but it doesn't seem to have the same function in C++.

Any help would be greatly appreciated

Franky Braem
June 22nd, 1999, 08:02 AM
One possible algorithme is this :

Read a char from the file. If the char is equal to the first char of the searchstring then add one to a counter. Read the next char
and check it with the second(= counter) char of your searchstring. If the char is not equal reset counter to 0. If counter is
equal to the length of your searchstring then you have found the string in the file.

Note you can use following functions like the mid in VB :

for char* : strstr()
CString-classes :
Mid()-method
Find()-method
std::string-class :
substr()-method
find()-method

Sophie
June 22nd, 1999, 09:58 AM
Would you have an example I could look at...I'm pretty new at this C++

Thank you

June 22nd, 1999, 10:06 AM
CString some_test_str = "this is my target !<some_thing_to_find>";

int start_pos = some_test_str.Find("!<");
int stop_pos = some_test_str.Find(">");
ASSERT(start_pos != -1 && stop_pos !=-1);
ASSERT(start_pos + 2 != stop_pos); // check that something is contained by !<>
CString found_str = some_test_str.Mid(start_pos + 2,stop_pos - start_post - 2);

Derek Viljoen
June 22nd, 1999, 01:12 PM
I did exactly this in an application I'm working on: (I read the file in pages)

#define BUFSIZE 8192
CString searchText( "search for this" );
FILE *fp = fopen( "file.dat", "wt" );
char *buffer = new char[ BUFSIZE + 1 ];
fseek( fp, SEEK_SET, 0 );
while( !feof( fp ) )
{
long slen = searchText.GetLength();
unsigned long curr = ftell( fp );
memset( buffer, '\0', BUFSIZE + 1 );
if( curr > (unsigned)slen )
fseek( fp, SEEK_CUR, -(slen) );
int len = fread( buffer, BUFSIZE, 1, fp );
if( len )
{
char *p = buffer;
while( p = strstr( p, searchText ) )
{
// p now points to an occurrence of
// search string
...
p += searchText.GetLength();
}
}
}
delete [] buffer;
fclose( fp );





Hope this helps.

Derek Viljoen
June 22nd, 1999, 01:42 PM
ummm... I meant to fopen with "rt", not "wt"...

Sorry.

Franky Braem
June 23rd, 1999, 02:16 AM
This is an example :


#include "stdio.h"
#include "string.h"

void main(void)
{
char *s = "<!--$$(";

FILE *f = fopen("test.txt", "r");
if ( f )
{
int nCount = 0;
while ( ! feof(f) )
{
if ( fgetc(f) == s[nCount] )
{
if ( s[++nCount] == '\0' )
{
printf("string found start at : %ld\n", ftell(f) - nCount);
nCount = 0;
}
}
else
nCount = 0;
}
fclose(f);
}
}

Franky Braem
June 23rd, 1999, 04:00 AM
There is an error in your code :

fseek( fp, SEEK_CUR, -(slen) );



should be

fseek( fp, -slen + 1, SEEK_CUR);



And another warning :
Always test if the fopen-function succeeded !!! Reading from a NULL-pointer will cause severe errors.

Derek Viljoen
June 23rd, 1999, 06:28 AM
Excellent catch!
But, I was re-typing this from my laptop's display into my desktop's browser and it was a typo... It's right in the original! And, I took this code from a method where the FILE * is a member var, and yes I always check it for NULL. This was just a simple example of how to do the search, and not intended to be a perfect implementation. ;->