[LC++]geting a "char *" (not const) from a string.data()

Chris Vine chris at cvine.freeserve.co.uk
Tue Jul 31 11:37:03 UTC 2001

On Monday 30 July 2001 12:38, Jan Pfeifer wrote:
> actually i have a parsing function that receives a string (text). So i
> want to read a whole text file into a string and pass it to the function.
> But i wanted to do this without having to read the file into a char
> buffer, and then copy to the string. I was wondering if there were, as you
> said a way to do a "string::resize" and get a pointer to this data, so
> that i could read the file directly there.
> any idea ?
> thanks for the answer,
> jan


As with the case of std::vector<char>, you could do -

  std::string text;
  read(fd, &text[0], filesize);

The non-const version of std::string::operator[]() returns a reference to the 
stored character -- it is intended to be available as a modifying access so 
that an expression like text[0] = 'a'; is a legitimate expression.  
Accordingly, using that operator to access the entire stored character 
sequence of the string will probably work with most or all implementations of 
std::string. std::string::data() and std::string::c_str() return an internal 
array or C string respectively of type const char*, which implies, but does 
not require, that a reasonable implementation of std::string (a synonym for 
std::basic_string<char>) will store characters in contiguous memory.  
However, I don't think that is actually a guarantee.  Amongst other matters, 
modifying the output of std::string::data() or std::string::c_str() results 
in undefined behaviour.  I think the defect report concerning contiguity only 
applies to std::vector. 

If you use this form, technically therefore I think it will be non-standard  
(but will probably work on all practical implementations).  Others on the 
list may be able to confirm whether the defect report applies to 


More information about the tuxCPProgramming mailing list