LINUX.ORG.RU

С++ как можно считать в переменую типа string весь файл ?


0

0

Привет!

Как можно считать в переменую типа string весь файл, используя только STL?

Можно например так:

fstream in("data.txt");

strinstream ss;

ss << in.rdbuf();

string s;

s = ss.str();

Но мне кажется что в приведенном решении слишком много раз содержимое файла будет копироваться.

А как еще можно ?

Спасибо!

anonymous

#include <cassert>
#include <fstream>
#include <string>
#include <iostream>
#include <iterator>

int main(int argc, char *argv[])
{
	assert(argc == 2);
	std::ifstream in(argv[1]);
	assert(in);
	std::string data((std::istreambuf_iterator<char>(in)),
			 std::istreambuf_iterator<char>());

	std::cout << data << std::endl;
	return 0;
}

fghj ★★★★★
()
Ответ на: комментарий от fghj

да-да, допер :)
Спасибо fghj!
Только я решил как:

cin.unsetf(std::ios_base::skipws) ;
istream_iterator<char> begin(in_file), end;
string s(begin, end);


а у тебя еще проще получается :) !!!

Теперь бы понять чем istrembuf_iterator отличается от istrem_iterator

Может кто розьяснит, а то мозг уже плавится :)

anonymous
()
Ответ на: комментарий от anonymous

ой!
заменить:
cin.unsetf(std::ios_base::skipws);
на:
in.file.unset(std::ios_base::skipws);

:)

Но всеравно не понимаю отличий istrembuf_iterator и istrem_iterator.

anonymous
()
Ответ на: комментарий от anonymous

>Теперь бы понять чем istrembuf_iterator отличается от istrem_iterator

istream_iterator по сути вызвает operator<<,
а istrembuf_iterator проводит бесформатнный ввод, а-ля read(2)

fghj ★★★★★
()
Ответ на: комментарий от anonymous

> Мощно, я тащусь :)

а если вы еще и Страуструпа, "Язык программирования С++" осилите, главы 18 и 19, вашему удивлению не будет придела.

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.