Board index » cppbuilder » Best way to load strings from file

Best way to load strings from file

Hi!
If I save numbers and strings to a file and then want to load the stuff I
can use code like this:
FileOpen(..);
int a;
char b[30];
FileRead(.., &a, sizeof(a));
FileRead(.., b, sizeof(b));
FileClose(..);

But how do I do if the string isn't always 30 characters? What's the best
way to search for the first 0-character and then load from current position
to that character.

And then I wonder how to load a text-file with FileRead. I know I can use
LoadTextFile, but how do I do with FileRead?

Thank you for all answers.

// M.E.

 

Re:Best way to load strings from file


Hi, Marcus!

You wil do much better to make use of the facilities of TStringList if
you need to read structured (but variable length) data from a text file.
For instance:

    TStringList    *StringList = new TStringList;

    StringList->CommaText = "1,20,abagfshsj,12,34556,12";

    if (StringList->Strings[1].ToInt() == 20)
    {
        StringList->SaveToFile("c:\\temp\\stuff.txt");

        TStringList    *OtherStringList = new TStringList;

        OtherStringList->LoadFromFile("c:\\temp\\stuff.txt");

        if (OtherStringList->Strings[1].ToInt() == 20)
        {
            // Everything's OK
        };

        delete OtherStringList;
    };

    delete StringList;

StringLists don't care about the size of their contents.

------
Mark Cashman (TeamB - C++ Builder), creator of The Temp{*word*203}Doorway at
http://www.temporaldoorway.com
- Original digital art, writing, music and more -
C++ Builder / JBuilder Tips and The C++ Builder Programmer's Webring
(Join us!)
http://www.temporaldoorway.com/programming/index.htm
------

Re:Best way to load strings from file


But I muste save both numbers and strings in the same file with binary
format. I must use a read file-method.

Please give me a hint!

/Marcus

Re:Best way to load strings from file


Hi Marcus
Quote
Marcus <mest...@hem.passagen.se> wrote in message

news:825bg9$1bg13@forums.borland.com...

Quote
> But I muste save both numbers and strings in the same file with binary
> format. I must use a read file-method.

This is only an opinion, but I think you'd be better off with either stdio
streams or iostreams than with ReadFile.

stdio.h example -- not tested

struct SmyRecord    // I'm sorry, but I forgot what your record looks like
...
    {
    int firstInt;
    char firstBuffer[20];
    int secondInt;
    char secondBuffer[40];
    };

SmyRecord myRecord;
SmyRecord * pmyRecord;

pmyRecord = &myRecord;

FILE * dataFP = fopen("myfile.dat","rb");     // open to read binary ...

while ( !feof( dataFP )
    {
    fread(pmyRecord, sizeof(SmyRecord), 1, dataFP);

    // do stuff with the elements of myRecord
    }
fclose ( dataFP);

good luck

liz

Re:Best way to load strings from file


Hi, Marcus!

You may try to use fopen()/fclose() functions for open/close accordingly
and fgets(), fscanf(), fgetc() for information reading. These are standard
functions for C (even not for C++). For more details check the help. If
you never use them and don't know where to start... We can help. I mean
not myself only but all people who read/write this newsgroup.
As for me in many cases I prefer these functions, because I can read and
write text and binary data from/to the same file. (But it could be another
reason for my prefference - I've been using them for many yeas - since I
started to learn C with help of Borland's Turbo C).

Quote
Marcus wrote:
> But I muste save both numbers and strings in the same file with binary
> format. I must use a read file-method.

> Please give me a hint!

--
| ))))) NCC
|
|___
|ooo|
|ooo|
|ooo|
|___|
Sergei.

Re:Best way to load strings from file


Hi Sergei!
You mean that I can use the standard C functions to read and write to the
file. Of course I can learn how to use these but even if I know where the
0-character is, I don't know how to read to it.
I can't use:
char buffer[nullcharpos];
and then load the string to that buffer. Please explain what to do.
Thanks...

/Marcus

Sergei Sorokin <ser...@ncc.nnov.ru> skrev i
diskussionsgruppsmeddelandet:3846904D.64F6E...@ncc.nnov.ru...

Quote
> Hi, Marcus!

> You may try to use fopen()/fclose() functions for open/close accordingly
> and fgets(), fscanf(), fgetc() for information reading. These are standard
> functions for C (even not for C++). For more details check the help. If
> you never use them and don't know where to start... We can help. I mean
> not myself only but all people who read/write this newsgroup.
> As for me in many cases I prefer these functions, because I can read and
> write text and binary data from/to the same file. (But it could be another
> reason for my prefference - I've been using them for many yeas - since I
> started to learn C with help of Borland's Turbo C).

Re:Best way to load strings from file


Quote
>char firstBuffer[20];

Hi Liz!
Maybe you don't saw this in my post:
"But how do I do if the string isn't always 30 characters?"

I mean if I don't know how long the string is, what's the best way to read
to the 0-character.

/Marcus

Re:Best way to load strings from file


Marcus

Check out fgets().

Re:Best way to load strings from file


Hi Marcus,
Quote
Marcus <mest...@hem.passagen.se> wrote in message

news:8264eo$9uc5@forums.borland.com...

Quote
> >char firstBuffer[20];

> Hi Liz!
> Maybe you don't saw this in my post:
> "But how do I do if the string isn't always 30 characters?"

> I mean if I don't know how long the string is, what's the best way to read
> to the 0-character.

You have the following straight forward options:

1. fixed length records - which you've already said is not the case
2. records that start with a length byte or word - which at least tells you
how many bytes to read
3. records with a terminator.  This is probably a special case of the option
below, because you'll still have to parse the elements.

And this more complicated option
4. some knowledge in the program of what the records will look like.

For example, if you know that the last number in a record will always be -1
you can keep putting numbers into your structure(s) until you reach -1.

#include <vector>
using std::vector;

FILE * fp = fopen("myfile","rb");
vector <int> recVect;
while (! feof(fp) )
    {
    int tempi = 0;
    while ( tempi != -1 )

        fread( &tempi, sizeof(int), 1, fp);
        if ( tempi != -1 )    // do stuff
            {
            }
        }
    // now do stuff with the record
    }

On the other hand if you know that the record will be 2 ints and two strings
(or whatever) you can try
something like this

#include <iostream>
#include <string>

using std::string;

class CIOClass
    {
    int firstInt;
    string firstString;
    int secondInt;
    string secondString;

  friend istream & operator >>(istream & is, CIOClass & rhs;    // for the
i/o
  friend ostream & operator <<(ostream & os, CIOClass & rhs);
    };

// if the record is text separated by spaces: e.g. 14 characters 15
morecharacters
istream & operator >>(istream & is, CIOClass & rhs)
    {
    is >> rhs.firstInt;
    is >> rhs.firstString;
    is >> rhs.secondInt;
    is >> rhs.secondString;

    return rhs;

    }

good luck

liz

// if the record is binary e.g. binInt  textendingwithspace binInt
textendingwithspace
istream & operator >>(istream & is, CIOClass & rhs)
    {
    is.read(& rhs.firstInt, sizeof(int));
    is >> rhs.firstString;
    is.read(& rhs.secondInt, sizeof(int));
    is >> rhs.secondString;

    return rhs;

    }

If the text strings contain spaces you'll have to parse more carefully, but
this may help get you started.

Re:Best way to load strings from file


Hi Liz!
Thanks for the answer.
But if I use this code to save the data:

    int MyNumber = 123, MyNumber2 = 456;
    String MyString = "ABC DEF", MyString2 = "GHI\r\nJKL";
    int hFile = FileCreate("C:\\test.txt");
    FileWrite(hFile, &MyNumber, sizeof(int));
    FileWrite(hFile, MyString.c_str(), MyString.Length() + 1);
    FileWrite(hFile, &MyNumber2, sizeof(int));
    FileWrite(hFile, MyString2.c_str(), MyString2.Length() + 1);
    FileClose(hFile);

The result is a file with the content:
"{   ABC DEF\0   GHI\r\nJKL\0"

And in words:
The first number in binary format
The first string
A 0-character
The second number in binary format
The second string
A 0-character

How do I turn the code to do the opposite? Load the data to MyNumber,
MyNumber2, MyString and MyString2. I tried some of your codes but I couldn't
get all work. Please try again to explain.

Thanks...

/Marcus

Liz Albin <Elizabeth.Al...@bowne.com> skrev i
diskussionsgruppsmeddelandet:826jt6$d1...@forums.borland.com...

Quote
> Hi Marcus,
> Marcus <mest...@hem.passagen.se> wrote in message
> news:8264eo$9uc5@forums.borland.com...
> > >char firstBuffer[20];

> > Hi Liz!
> > Maybe you don't saw this in my post:
> > "But how do I do if the string isn't always 30 characters?"

> > I mean if I don't know how long the string is, what's the best way to
read
> > to the 0-character.

> You have the following straight forward options:

> 1. fixed length records - which you've already said is not the case
> 2. records that start with a length byte or word - which at least tells
you
> how many bytes to read
> 3. records with a terminator.  This is probably a special case of the
option
> below, because you'll still have to parse the elements.

> And this more complicated option
> 4. some knowledge in the program of what the records will look like.

> For example, if you know that the last number in a record will always
be -1
> you can keep putting numbers into your structure(s) until you reach -1.

> #include <vector>
> using std::vector;

> FILE * fp = fopen("myfile","rb");
> vector <int> recVect;
> while (! feof(fp) )
>     {
>     int tempi = 0;
>     while ( tempi != -1 )

>         fread( &tempi, sizeof(int), 1, fp);
>         if ( tempi != -1 )    // do stuff
>             {
>             }
>         }
>     // now do stuff with the record
>     }

> On the other hand if you know that the record will be 2 ints and two
strings
> (or whatever) you can try
> something like this

> #include <iostream>
> #include <string>

> using std::string;

> class CIOClass
>     {
>     int firstInt;
>     string firstString;
>     int secondInt;
>     string secondString;

>   friend istream & operator >>(istream & is, CIOClass & rhs;    // for the
> i/o
>   friend ostream & operator <<(ostream & os, CIOClass & rhs);
>     };

> // if the record is text separated by spaces: e.g. 14 characters 15
> morecharacters
> istream & operator >>(istream & is, CIOClass & rhs)
>     {
>     is >> rhs.firstInt;
>     is >> rhs.firstString;
>     is >> rhs.secondInt;
>     is >> rhs.secondString;

>     return rhs;

>     }

> good luck

> liz

> // if the record is binary e.g. binInt  textendingwithspace binInt
> textendingwithspace
> istream & operator >>(istream & is, CIOClass & rhs)
>     {
>     is.read(& rhs.firstInt, sizeof(int));
>     is >> rhs.firstString;
>     is.read(& rhs.secondInt, sizeof(int));
>     is >> rhs.secondString;

>     return rhs;

>     }

> If the text strings contain spaces you'll have to parse more carefully,
but
> this may help get you started.

Re:Best way to load strings from file


Easiest way is probably to write a function that reads an int, then reads one
character at a time from the file 'til it encounters a 0. Pass pointers to an
int and a string to the function, and have the function put the read int and
string into the addresses pointed to by the pointers. Here is a quick (untested)
example, though the syntax is probably not right, and I know the use of * and &
is not right ( I usually have to experiment with them to get them to work right,
just can't seem to get a clear understanding of how they work).

void MyStrRead ( int hfile, int *number, char *string)
{ char newchar;
    FileRead(hfile, &number, sizeof(int);
    while (newbie != 0)
    {
    FileRead(hfile, newchar, sizeof(char)
    if (newbie != 0)
         &string=&string+newchar;
    }

Quote
}

Then every time you need to read in your data, make sure that your file position
is at the first int you want to read and call this function. May take a little
playing with but will work.

HTH

Quote
Marcus wrote:
> Hi Liz!
> Thanks for the answer.
> But if I use this code to save the data:

>     int MyNumber = 123, MyNumber2 = 456;
>     String MyString = "ABC DEF", MyString2 = "GHI\r\nJKL";
>     int hFile = FileCreate("C:\\test.txt");
>     FileWrite(hFile, &MyNumber, sizeof(int));
>     FileWrite(hFile, MyString.c_str(), MyString.Length() + 1);
>     FileWrite(hFile, &MyNumber2, sizeof(int));
>     FileWrite(hFile, MyString2.c_str(), MyString2.Length() + 1);
>     FileClose(hFile);

> The result is a file with the content:
> "{   ABC DEF\0   GHI\r\nJKL\0"

> And in words:
> The first number in binary format
> The first string
> A 0-character
> The second number in binary format
> The second string
> A 0-character

> How do I turn the code to do the opposite? Load the data to MyNumber,
> MyNumber2, MyString and MyString2. I tried some of your codes but I couldn't
> get all work. Please try again to explain.

> Thanks...

> /Marcus

> Liz Albin <Elizabeth.Al...@bowne.com> skrev i
> diskussionsgruppsmeddelandet:826jt6$d1...@forums.borland.com...
> > Hi Marcus,
> > Marcus <mest...@hem.passagen.se> wrote in message
> > news:8264eo$9uc5@forums.borland.com...
> > > >char firstBuffer[20];

> > > Hi Liz!
> > > Maybe you don't saw this in my post:
> > > "But how do I do if the string isn't always 30 characters?"

> > > I mean if I don't know how long the string is, what's the best way to
> read
> > > to the 0-character.

> > You have the following straight forward options:

> > 1. fixed length records - which you've already said is not the case
> > 2. records that start with a length byte or word - which at least tells
> you
> > how many bytes to read
> > 3. records with a terminator.  This is probably a special case of the
> option
> > below, because you'll still have to parse the elements.

> > And this more complicated option
> > 4. some knowledge in the program of what the records will look like.

> > For example, if you know that the last number in a record will always
> be -1
> > you can keep putting numbers into your structure(s) until you reach -1.

> > #include <vector>
> > using std::vector;

> > FILE * fp = fopen("myfile","rb");
> > vector <int> recVect;
> > while (! feof(fp) )
> >     {
> >     int tempi = 0;
> >     while ( tempi != -1 )

> >         fread( &tempi, sizeof(int), 1, fp);
> >         if ( tempi != -1 )    // do stuff
> >             {
> >             }
> >         }
> >     // now do stuff with the record
> >     }

> > On the other hand if you know that the record will be 2 ints and two
> strings
> > (or whatever) you can try
> > something like this

> > #include <iostream>
> > #include <string>

> > using std::string;

> > class CIOClass
> >     {
> >     int firstInt;
> >     string firstString;
> >     int secondInt;
> >     string secondString;

> >   friend istream & operator >>(istream & is, CIOClass & rhs;    // for the
> > i/o
> >   friend ostream & operator <<(ostream & os, CIOClass & rhs);
> >     };

> > // if the record is text separated by spaces: e.g. 14 characters 15
> > morecharacters
> > istream & operator >>(istream & is, CIOClass & rhs)
> >     {
> >     is >> rhs.firstInt;
> >     is >> rhs.firstString;
> >     is >> rhs.secondInt;
> >     is >> rhs.secondString;

> >     return rhs;

> >     }

> > good luck

> > liz

> > // if the record is binary e.g. binInt  textendingwithspace binInt
> > textendingwithspace
> > istream & operator >>(istream & is, CIOClass & rhs)
> >     {
> >     is.read(& rhs.firstInt, sizeof(int));
> >     is >> rhs.firstString;
> >     is.read(& rhs.secondInt, sizeof(int));
> >     is >> rhs.secondString;

> >     return rhs;

> >     }

> > If the text strings contain spaces you'll have to parse more carefully,
> but
> > this may help get you started.

Re:Best way to load strings from file


Hi, Marcus!

Quote
Marcus wrote:
> Hi Sergei!
> You mean that I can use the standard C functions to read and write to the
> file. Of course I can learn how to use these but even if I know where the
> 0-character is, I don't know how to read to it.
> I can't use:
> char buffer[nullcharpos];
> and then load the string to that buffer. Please explain what to do.
> Thanks...

Ok, as I promise here there is a short example on how to use C functions for
file read/write.
Use the next functions:
fopen - open file
fclose - close file
fgets - read a string (until code 13 is reached)
fgetc - read one char
fread - read chars "as is" to the buffer of any type (could be float, integer,
double ...)
ftell - get position in the file
fseek - change position in the file

sscanf - read information from string.

also there is function fscanf, but I don't recommend it.

#include <stdio.h>
FILE *in_file;
....

if( (in_file=fopen( /* (char *) */YourFileName, "r" )) == NULL )
{
    /* inform user that file can't be opened, leave function where you are
working or do any other action */

Quote
}

else
{
    /* read whatever you want - who to do it see below */

Quote
} /* end of file reading */

fclose(in);

Information reading.
When using these functions you can consider file as an array of chars. Also,
every time you read some characters, position in the file (array) is increased
by number of chars you have red. In order to get position in the file you may
use ftell(...) function; for changing use fseek(...). Then, fgets function reads
from current position up to the char with the code 13 but no more than you enter
in it's second parameter. Function fgetc(...) gets one char only.

    In your case if you wish to read up to the char 0 you can do the next:
1. Save current, start position (ftell).
2. Get chars one by one until char 0 is reached.
3. Get difference between current position and start position (also using
ftell).
4. Reserve enough space.
5. Go to start position (fseek)
6. Read once more.

Of course, you can create you own function (like fgets) which will read file
until char 0 is reached and return string.

Function sscanf.
This function is very useful if you read a string from file and wish to get from
it some more info.
For example, you have in the file string
1, 2, 4.275, "Hello"

In order to get this information do the next:

int Int1, Int2;
float Float1;
char Buffer[200]; // assuming that string can't be more
char Str[100];

// assuming that file is opened already

if( fgets( Buffer, 200, in_file) != NULL )
{
    if( sscanf( Str, "%d, %d, %f, %s", &Int1, &Int2, &Float1, Str) == 4 )
    {
        // do something
    }

Quote
}

If you have binary data anywhere in the file you can read them using function
fread.
For example, you wrote in the file the set of structures
struct Examp { int Int1; float Float1 };

Then you can derive them:
// file is opened already

struct Examp ForRead;

while( fread( (void *) &ForRead, sizeof(ForRead), 1, in_file) != NULL )
{
    // use this info

Quote
}

For more detail on how to use these functions check helpfiles.

--
| ))))) NCC
|
|___
|ooo|
|ooo|
|ooo|
|___|
Sergei.

Re:Best way to load strings from file


Marcus,

As I said before, as long as you have a delimiter you can parse the string
you read in.

My preference, and this is only an opinion, is to use either the stdio.h
routines such as fread() or the newer c++ iostreams routines, so that I
wouldn't have used FileWrite();

An example:

int MyNumber1 = 123;
int MyNumber2 = 456;
AnsiString MyString = "ABC DEF", MyString2 = "GHI\r\nJKL";

FILE * ofp = fopen("test.dat","wb");
fwrite( &MyNumber1, sizeof(int), 1, ofp);
fwrite( &MyString1.c_str(), MyString1.Length() + 1, 1, ofp);
fwrite( &MyNumber2, sizeof(int), 1, ofp);
fwrite( &MyString2.c_str(), MyString1.Length() + 1, 1, ofp);

fclose(ofp);

FILE * ifp = fopen("test.dat", "rb");

// get 1 record ...
fread(  &MyNumber1, sizeof(int), 1, ifp);
char tempc;
char tempbuffer[1000];
int i;

i = 0;

//  read in 1st string
while (1 )
    {
    fread ( &tempc, 1, 1, ifp);

    if ( ! ifp || feof(ifp) || ferror(ifp)
        {
        break;    //  end of char buffer
        }
    tempbuffer[i++] = tempc;
    if ( tempc == 0 )
        {
        break ;    //  last char
        }
    }

AnsiString MyReadString1 = tempbuffer;

Another option would be to write out with the length:
fwrite( &MyNumber1, sizeof(int), 1, ofp);
int len = MyString1.Length();
fwrite( &len, sizeof(int), 1, ofp );    // length of string
fwrite( &MyString1.c_str(), MyString1.Length() + 1, 1, ofp);

good luck

liz

Quote
Marcus <mest...@hem.passagen.se> wrote in message

news:826qif$g0j2@forums.borland.com...
Quote
> Hi Liz!
> Thanks for the answer.
> But if I use this code to save the data:

>     int MyNumber = 123, MyNumber2 = 456;
>     String MyString = "ABC DEF", MyString2 = "GHI\r\nJKL";
>     int hFile = FileCreate("C:\\test.txt");
>     FileWrite(hFile, &MyNumber, sizeof(int));
>     FileWrite(hFile, MyString.c_str(), MyString.Length() + 1);
>     FileWrite(hFile, &MyNumber2, sizeof(int));
>     FileWrite(hFile, MyString2.c_str(), MyString2.Length() + 1);
>     FileClose(hFile);

> The result is a file with the content:
> "{   ABC DEF\0   GHI\r\nJKL\0"

> And in words:
> The first number in binary format
> The first string
> A 0-character
> The second number in binary format
> The second string
> A 0-character

> How do I turn the code to do the opposite? Load the data to MyNumber,
> MyNumber2, MyString and MyString2. I tried some of your codes but I
couldn't
> get all work. Please try again to explain.

> Thanks...

> /Marcus

> Liz Albin <Elizabeth.Al...@bowne.com> skrev i
> diskussionsgruppsmeddelandet:826jt6$d1...@forums.borland.com...
> > Hi Marcus,
> > Marcus <mest...@hem.passagen.se> wrote in message
> > news:8264eo$9uc5@forums.borland.com...
> > > >char firstBuffer[20];

> > > Hi Liz!
> > > Maybe you don't saw this in my post:
> > > "But how do I do if the string isn't always 30 characters?"

> > > I mean if I don't know how long the string is, what's the best way to
> read
> > > to the 0-character.

> > You have the following straight forward options:

> > 1. fixed length records - which you've already said is not the case
> > 2. records that start with a length byte or word - which at least tells
> you
> > how many bytes to read
> > 3. records with a terminator.  This is probably a special case of the
> option
> > below, because you'll still have to parse the elements.

> > And this more complicated option
> > 4. some knowledge in the program of what the records will look like.

> > For example, if you know that the last number in a record will always
> be -1
> > you can keep putting numbers into your structure(s) until you reach -1.

> > #include <vector>
> > using std::vector;

> > FILE * fp = fopen("myfile","rb");
> > vector <int> recVect;
> > while (! feof(fp) )
> >     {
> >     int tempi = 0;
> >     while ( tempi != -1 )

> >         fread( &tempi, sizeof(int), 1, fp);
> >         if ( tempi != -1 )    // do stuff
> >             {
> >             }
> >         }
> >     // now do stuff with the record
> >     }

> > On the other hand if you know that the record will be 2 ints and two
> strings
> > (or whatever) you can try
> > something like this

> > #include <iostream>
> > #include <string>

> > using std::string;

> > class CIOClass
> >     {
> >     int firstInt;
> >     string firstString;
> >     int secondInt;
> >     string secondString;

> >   friend istream & operator >>(istream & is, CIOClass & rhs;    // for
the
> > i/o
> >   friend ostream & operator <<(ostream & os, CIOClass & rhs);
> >     };

> > // if the record is text separated by spaces: e.g. 14 characters 15
> > morecharacters
> > istream & operator >>(istream & is, CIOClass & rhs)
> >     {
> >     is >> rhs.firstInt;
> >     is >> rhs.firstString;
> >     is >> rhs.secondInt;
> >     is >> rhs.secondString;

> >     return rhs;

> >     }

> > good luck

> > liz

> > // if the record is binary e.g. binInt  textendingwithspace binInt
> > textendingwithspace
> > istream & operator >>(istream & is, CIOClass & rhs)
> >     {
> >     is.read(& rhs.firstInt, sizeof(int));
> >     is >> rhs.firstString;
> >     is.read(& rhs.secondInt, sizeof(int));
> >     is >> rhs.secondString;

> >     return rhs;

> >     }

> > If the text strings contain spaces you'll have to parse more carefully,
> but
> > this may help get you started.

Re:Best way to load strings from file


: "Liz Albin" <Elizabeth.Al...@bowne.com> wrote:

Could you all please cut out quoted text that you don't explicitly refer
to?

It is a bit painful to see postings which add 30 lines to 180 lines of
quoted (!) text.

The newsgroup guidelines at http://www.borland.com/newsgroups/ offer this
insight:

"4. Do keep quoted text to a minimum.  
When quoting a previous post, edit out the non-relevant parts of the
message. A good rule of thumb is that there should not be more quoted text
than original text. Do not re-post an entire message in order to indicate
your agreement. This is known as a "Me too!" message. If you include
quoted text in your message, be considerate and clean up the margins and
line breaks in the quoted material. Quoted text is typically preceded by a
">" which increases the line length. The longer line length causes the
message editor to re-parse the line and insert new line breaks that can
conflict with the existing line breaks."

Thanks!

--
General information:
  * Post to the right group - http://www.borland.com/newsgroups/
    * Do not cross- or multipost
      * Research at http://www.mers.com/searchsite.html

Stefan Hoffmeister - http://www.econos.de/
(TeamB - http://www.teamb.com/)

Other Threads