Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > STL: text file to vector<string>


Автор: John_Doe 16.7.2004, 18:04
Hi all,

Подскажите, плз, как считать текстовый файл в vector<string>, чтобы строки не разбивались по пробелам, а только по \n или \r?

Делаю так:

ifstream ifs("test.txt");
istream_iterator<string> ii(ifs);
istream_iterator<string> ieos;
vector<string> vs(ii, ieos);

засунуть куда-нибудь noskipws не получается... может не туда? ;)

Заранее признателен за вашу помощь!

Автор: Олег М 19.7.2004, 08:15
А так не получается?

Код
cin>>noskipws>>str;


Автор: Олег М 19.7.2004, 08:54
В смысле cin>>skipws>>str;

Автор: John_Doe 19.7.2004, 09:40
Олег,
спасибо, конечно, но, простите, где вы видите cin?
Если бы я хотел считывать из консоли, то конечно бы именно так и сделал (таких примеров в каждой книжке по С++ достаточно). Но мне нужно именно из файла и с наименьшими усилиями (можно было бы использовать getline() - но это не столь красиво и кратко).

Автор: Олег М 19.7.2004, 10:28
Цитата
спасибо, конечно, но, простите, где вы видите cin?

ifs>>skipws>>str; biggrin.gif
Читаешь в цикле по одной строке и запихиваешь в массив

Автор: John_Doe 19.7.2004, 12:10
Так я ж поэтому и упомянул, что решения "в лоб" мне не хочется. Хочется кратко и красиво, как в приведённом мной примере с инициализацией вектора через итераторы входного потока.
Поэтому и спросил здесь, надеясь на помощь гуру, а не потому, что просто решения в лоб через ifs.getline(str) - ну или с использованием ifs>>skipws>>str - и push_back(str) мне не известно...

Спасибо, Олег, за внимание, но, право слово, хочется красоты. rolleyes.gif

Автор: Олег М 19.7.2004, 12:18
Цитата
право слово, хочется красоты

Молодец!

Перепиши оператор >> для своего класса - будет красиво и круто

Автор: John_Doe 19.7.2004, 13:14
Типа, красиво никак? Будем искать...

Автор: Олег М 19.7.2004, 13:29
Цитата
Типа, красиво никак

А что ты тогда понимаешь под красотой? Чтобы вручную вообще нифига не писать?

Автор: John_Doe 19.7.2004, 15:56
Под красотой я понимаю максимальное использование доступных средств при минимуме рутины.
Например, "красивее" использовать for_each вместо прохода с итератором.
А если "вообще нифига не писать", то и красоты не будет. smile.gif Из ничего ничего не родится. А ты как думал? ;)
Ещё раз повторю - решение в лоб меня не интересовало, тк. я его и сам знал. Хотелось узнать, можно ли сделать красивее с использованием итераторов потока ввода. Если ты уверен, что так сделать нельзя, то нужно было сразу это и сказать...

Автор: Morel 20.7.2004, 09:49
Код

vector<string> ProgramText1;
ifstream in;
in.open(FileName);

copy(istream_iterator<string,vector<string>::difference_type>(in),
     istream_iterator<string,vector<string>::difference_type>(),
     inserter(ProgramText1,ProgramText1.begin()));
in.close();


Правда конец строки любой разделитель, но можешь что нибудь дальше сам придумать.


Автор: John_Doe 21.7.2004, 15:54
Спасибо, Morel. Но скажи, пожалуйста, чем твой вариант отличается от приведённого мной?
Для простоты восприятия, можно слегка модифицировать мой пример (поближе к твоему):
Код

ifstream ifs("test.txt");
istream_iterator<string, vector<string>::difference_type> ii(ifs);
istream_iterator<string, vector<string>::difference_type> ieos;
vector<string> vs(ii, ieos);


Мой вариант делает ровно тоже самое, только короче и понятнее = красивее. Беда только в том, что конец строки не тот, что нужно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)