Re: get some chars from a .txt file
In article <1169122223.333751.181680@m58g2000cwm.googlegroups.com>,
James Kanze <james.kanze@gmail.com> wrote:
class nolf_buf:public std::streambuf
{
std::vector<char> &data;
int overflow(int c = EOF)
Overflow is the function called when writing, not when reading.
The function you want to replace is underflow. If you're trying
to use a filtering streambuf on input.
{
try
{
if(c!=EOF && c!='\n')
data.push_back(char(c));
}
catch (...)
{
return EOF;
}
return '0'; // not eof
}
public:
nolf_buf(std::vector<char> &a):data(a){}
};
But this is not a filtering streambuf. It's just a regular
streambuf which writes to a std::vector. (Somewhere in my
code---I don't know if it's in the online stuff or not---I've
got a streambuf based on STL iterators; it's been a while since
I've used it, and I forget the details, but I think it should be
possible to instantiate it for output on a
back_insertion_iterator for the vector.)
,,,
std::vector<char> data;
nolf_buf buf(data);
in_file >> &buf; // data now contains the file contents
....
It is a filtering streambuf that writes to a vector<char> it removes
'\n's that it is fed, After initial thought the possibly best way to
read the rest of the file into a vector was use an operator >>
(streambuf *); If the size of the vector can be estimated, reserve()
can improve performance some more.
I guessed this approach should be at least as efficient as using
iterators after noting the istreambuf_iterator<char> solution.
Also not obvious to the 'casual user' of streams...
A more general approach if the file is handled a piece at a time is
a 'normal' filtering streambuf to remove '\n' during the input.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]