help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: <g++ 3.4.4> Problem with reading file into string


From: Alex Vinokur
Subject: Re: <g++ 3.4.4> Problem with reading file into string
Date: 11 Aug 2005 09:12:29 -0700
User-agent: G2/0.2

"Ulrich Eckhardt" <doomster@knuut.de> wrote in message
3m13l1F13pdbtU1@uni-berlin.de">news:3m13l1F13pdbtU1@uni-berlin.de...
> alexvn@users.sourceforge.net wrote:
> > Here are two functions that read text and binary file into string.
>
> Alex, apart from being really horrible C++[1], do these functions do
> anything different except that they operate on different streams for
> input? I just scanned them visually and could not find any other
> differences...
>
> Also, the code seems pretty convoluted, if anything there explicitly
> matters, you completely fail to point out that difference.

Ulrich, those functions are part of testsuites "Comparative Performance
Measurement. Reading file into string" at
http://groups.google.com/group/perfo/msg/8273f4d1a05cfbd1
http://groups.google.com/group/sources/msg/27a9b6f91239c909 .

There are 24 different C++-functions including two discussed ones.

>
> Uli
>
> [1]: I'm not sure if/where it matters, here's how it could have been
> written differently:
>
> > string txt_file_to_string ()
>
> If the two functions are the same, you could as well have passed the stream
> as reference:
>   string to_string( std::ifstream& in)
> or alternatively passing along the expected size.

Of course. But to measure "pure" performance I prefered to avoid
passing arguments.

>
> > ostringstream oss;
>
> Starting with this, there is an operator>> overload that takes a
> streambuffer on the right hand side, so copying the file into that buffe
> would be a mere
>   in >> oss.rdbuf();

Several of testsuites use rdbuf().

>
> > vector<char> v (infile_txt_filesize);
> >   fs_infile_txt.read(&v[0], infile_txt_filesize);
>
> Could init the vector with the content of the file instead:
>   vector<char> v( (istream_iterator<char>(in)), istream_iterator());
>
> > ostream_iterator<char> out(oss);
> >   copy (&v[0], &v[v.size()], out);
>
> You're thinking too complicated:
>   copy( v.begin(), v.end(), ostream_iterator<char>(oss));

I wanted to work here with pointers (not with iterators) in that
functions.

Other functions (in the testsuites) work with copy() and iterators.

>
> >   return oss.str();
>
> How about
>   return std::string( (istream_iterator<char>(in)), istream_iterator());
> here? Alternatively, something like this:
>   std::string res(infile_filesize);
>   std::copy( istream_iterator<char>(in), istream_iterator(), str.begin());
>
[snip]

Similar methods are used in other functions of the testsuites.

Thanks,

--
 Alex Vinokur
     email: alex DOT vinokur AT gmail DOT com
     http://mathforum.org/library/view/10978.html
     http://sourceforge.net/users/alexvn



reply via email to

[Prev in Thread] Current Thread [Next in Thread]