Re: How to load a text file into a char **?
On Jul 19, 3:57 am, "Daniel T." <danie...@earthlink.net> wrote:
ampheta...@gmail.com wrote:
Is there a safe (unlikely to cause overflows or segfaults)
way to load a text file into a char ** array?
A char** array? Are you sure you got that right?
Maybe he needs to interface with some legacy C code.
(Otherwise, of course, std::vector< std::string > is the obvious
choice.)
I thought of using getline, but it needs a fixed-length
string, and I don't know how many lines or characters per
line the file has.
// puts the entire contents in a char array
vector<char> read( const char* fileName )
{
vector<char> result;
ifstream file( fileName, ios::binary );
char ch;
while ( file.get( ch ) )
result.push_back( ch );
return result;
}
or
// puts the entire contents in a char* array,
// breaks file by newlines.
vector< vector<char> > read( const char* fileName )
{
vector< vector<char> > result;
ifstream file( fileName );
string str;
while ( getline( file, str ) ) {
result.push_back( vector<char>( str.begin(), str.end() ) );
result.back().push_back( 0 ); // null terminate each line?
}
return result;
}
I guess for a char** array, you could put each word in a separate
block...
I think he wants one string per line. But I'd still use a
vector of string for the reading, only converting into char**
once the file had been read, e.g.:
std::vector< std::string > tmp ;
std::string line ;
while ( std::getline( file, line ) ) {
tmp.push_back( line ) ;
}
std::vector< char const* > result ;
for ( std::vector< std::string >::const_iterator
iter = tmp.begin() ;
iter != tmp.end() ;
++ iter ) {
result.push_back( iter->c_str() ) ;
}
result.push_back( NULL ) ; // if needed.
// use &result[0].
(In fact, I just did exactly this yesterday, to interface with
openldap.)
Note that in this case, you cannot simply return &result[0], and
expect it to work. For obvious reasons, you must use &result[0]
before either tmp or result go out of scope. In a larger
application, the solution, I think would be to create a class
which contained these two members, contructed the above in its
constructor, and had a function to return the char**. (It the
needed type really is char**, as was the case with openldap,
you'll have to const_cast.)
--
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