reading a file into a string

D

David Bellot

Hi everybody,

I'd like to read part of a file directly into the internal buffer of a
string so that not to use the copy constructor to fill in my string.

What I did before was :

char buffer[1024];
ifstream f("my_file");

f.seekg(my_position);
f.read(buffer, my_size);

string s(buffer);

and the last line cost is that it uses a copy constructor to transfer
data from the buffer into the string's buffer. The file I wanna read is
really large (129Gb) and I don't wanna have to copy 129Gb for nothing.

The string is then used with a library (actually, it's the
Boost::tokenizer which requires a string).

Do you guys have a solution ?

Thanks,
David
 
T

Thomas J. Gritzan

David said:
I'd like to read part of a file directly into the internal buffer of a
string so that not to use the copy constructor to fill in my string.

What I did before was :

char buffer[1024];
ifstream f("my_file");

f.seekg(my_position);
f.read(buffer, my_size);

string s(buffer);

and the last line cost is that it uses a copy constructor to transfer
data from the buffer into the string's buffer. The file I wanna read is
really large (129Gb) and I don't wanna have to copy 129Gb for nothing.

The string is then used with a library (actually, it's the
Boost::tokenizer which requires a string).

I'm checked the documentation and I am quite sure that you don't need a
std::string for tokenizer. You can use a begin/end iterator (or pointer) pair.

I hope you don't try to hold the complete file in memory :)
 
J

Jim Langston

David Bellot said:
Hi everybody,

I'd like to read part of a file directly into the internal buffer of a
string so that not to use the copy constructor to fill in my string.

What I did before was :

char buffer[1024];
ifstream f("my_file");

f.seekg(my_position);
f.read(buffer, my_size);

string s(buffer);

and the last line cost is that it uses a copy constructor to transfer data
from the buffer into the string's buffer. The file I wanna read is really
large (129Gb) and I don't wanna have to copy 129Gb for nothing.

The string is then used with a library (actually, it's the
Boost::tokenizer which requires a string).

Do you guys have a solution ?

One option would be to use a std::vector<char> instead of a std::string.
Preallocate the 1024 bytes and write directly into the vectors memory (which
is allowed) using (I believe) .data().

Of course this won't get you std::strings benifits (substr, etc...)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,192
Latest member
KalaReid2

Latest Threads

Top