Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> потоковое чтение из файла, istreambuf_iterator<string> 
V
    Опции темы
cupper
Дата 10.3.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Нужно построчно считать файл в list<string>
в начале сделал вот так
Код

ifstream file("messages.txt");
if(!file)
    throw std::exception("cannot open file");
list<string> listOfStrMsg((istream_iterator<string>(file)), istream_iterator<string>());

работает если в строке нет пробелов, иначе получается не то что нужно.
Попробовал убрать режим пропуска пробелов, добавив
Код

file.unsetf(ios::skipws);

в этом случае считывается только первая строка (в ней нет пробелов, совпадение или как)
--> PS. забавно, вместо того что бы считывать и пробелы тоже, считывание происходит до первого пробельного символа а дальше прекращается.

Далее решил заюзать вот так
Код

        ifstream file("messages.txt");
        if(!file)
            throw std::exception("cannot open file");
        list<string> listOfStrMsg((istreambuf_iterator<string>(file)), istreambuf_iterator<string>());

на что имею непонятную мне ошибку
Код

error C2440: '<function-style-cast>' : cannot convert from 'std::ifstream' to 'std::istreambuf_iterator<_Elem>'


на этом идеи исчерпались :( как сделать задуманное ? (используя потоковые итераторы)

Это сообщение отредактировал(а) cupper - 10.3.2011, 13:05
PM MAIL   Вверх
rudvil
Дата 10.3.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 20.11.2009
Где: Latvia/Riga

Репутация: 2
Всего: 3



А почему он вообще должен считывать построчно?
Пример использования std::istreambuf_iterator<>() для считывания всего файла в стринг
Код
std::ifstream file("messages.txt");
file.unsetf(std::ios::skipws);
std::string str(std::istreambuf_iterator<char>(file.rdbuf()), std::istreambuf_iterator<char>());

Как видно никаких разделителей тут нету.
--------------------
xor
PM MAIL Skype   Вверх
baldina
Дата 10.3.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(cupper @  10.3.2011,  13:03 Найти цитируемый пост)
Нужно построчно считать файл в list<string>

istream::getline()
PM MAIL   Вверх
cupper
Дата 10.3.2011, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(rudvil @ 10.3.2011,  13:32)
А почему он вообще должен считывать построчно?

потому что я так сказал
Код

list<string> listOfStrMsg((istreambuf_iterator<string>(file)), istreambuf_iterator<string>());


меня не интересует по символьное считывание.

PS. когда читаешь через буферезированный итератор, делать
Код

file.unsetf(std::ios::skipws);

не нужно, так как он читает на прямую буфера и возвращает все символы.
PM MAIL   Вверх
boostcoder
Дата 10.3.2011, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



как-то так:
Код

class line {
    std::string data;
public:
    friend std::istream &operator>>(std::istream &is, line &l) {
        std::getline(is, l.data);
        return is;
    }
    operator std::string() { return data; }    
};

...

std::list<std::string> lines(
   (std::istream_iterator<line>(std::cin)),
   (std::istream_iterator<line>())
);

PM WWW   Вверх
cupper
Дата 10.3.2011, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(boostcoder @ 10.3.2011,  16:21)
как-то так:
Код

class line {
    std::string data;
public:
    friend std::istream &operator>>(std::istream &is, line &l) {
        std::getline(is, l.data);
        return is;
    }
    operator std::string() { return data; }    
};

...

std::list<std::string> lines(
   (std::istream_iterator<line>(std::cin)),
   (std::istream_iterator<line>())
);

это способ который просто пришел в голову, или это единственный способ сделать задуманное ?

Изначально хотел именно без введение какиз либо дополнитеьный манипуляций сделать. 
Странно что с istream_iterator<string>(ifstream_) работает, а istreambuf_iterator<string>(ifstream_) уже нет. Это именно архитектурное ограничение сего итератора ? или все таки что то я сделал не правильно.
PM MAIL   Вверх
boostcoder
Дата 10.3.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(cupper @  10.3.2011,  16:37 Найти цитируемый пост)
или это единственный способ сделать задуманное ?

полагаю, что единственный. по крайней мере, когда я задался тем же вопросом, это был единственный способ проделать желаемое.

Цитата(cupper @  10.3.2011,  16:37 Найти цитируемый пост)
Странно что с istream_iterator<string>(ifstream_) работает, а istreambuf_iterator<string>(ifstream_) уже нет. Это именно архитектурное ограничение сего итератора ?

не уверен. но предположу, что это связанно с тем, что для istream_iterator проверяется наличие operator std::string(), а для istreambuf_iterator - нет.
PM WWW   Вверх
baldina
Дата 10.3.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(cupper @  10.3.2011,  16:37 Найти цитируемый пост)
Изначально хотел именно без введение какиз либо дополнитеьный манипуляций сделать. 

не получится. для использования итераторов потребуется как минимум переопределить operator>>
если просто переопределять оператор, поместить его придется в std, что не очень хорошая идея
либо явный цикл с getline()

Код

namespace std {
  istream &operator>>(istream &is, string& s)
  {
      getline(is, s);
      return is;
  }
}
...
using namespace std;
list<string> lines((istream_iterator<string>(cin)),istream_iterator<string>());


vs

Код

using namespace std;
while (!cin.eof())
{
  string str;
  getline (cin, str);
  lines.push_back(str);
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1069 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.