Re: replace string in byte stream
On Mar 25, 10:08 am, Ian Collins <ian-n...@hotmail.com> wrote:
Carmen Sei wrote:
I have a function that read data byte and drmp to a file
how can I change the string <givenname xsi:nil='true'/> to
<givenname>.</givenname>
Learn how to use std::string.
If I understand correctly, he's dealing with an input stream,
not strings. Of course, one simple solution would be to read
the input line by line, using string functions on each line to
search for the string and replace it. But in such cases, I'll
generally use an std::deque<char>, something like:
void
fillQueue(
std::deque< char >& queue,
std::istream& source,
size_t targetLength )
{
assert( queue.size() <= targetLength ) ;
while ( queue.size() != targetLength
&& source.peek() != EOF ) {
queue.push_back( source.get() ) ;
}
}
void
globalSearchAndReplace(
std::istream& source,
std::ostream& dest,
std::string const& search,
std::string const& replace )
{
std::deque< char > window ;
fillQueue( window, source, search.size() ) ;
while ( window.size() != search.size() ) {
if ( std::equal( window.begin(), window.end(),
search.begin() ) ) {
dest << replace ;
window.clear() ;
} else {
dest << window.front() ;
window.pop_front() ;
}
fillQueue( window, source, search.size() ) ;
}
std::copy( window.begin(), window.end(),
std::ostream_iterator< char >( dest ) ) ;
}
Note that this will work even if the search string contains a
newline. (On the other hand, it cannot easily be adapted to use
regular expressions for the search, where the size of the string
to be matched may be unbound.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34