| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > friend std::istream &operator>> для класса строки |
| Автор: anatox91 16.5.2008, 13:07 | ||||
| подскажите пожалуйста как реализовать сабж. с operator<< собсно все легко, а вот этот оператор как-то не доганяю как реализовать приват-секция моего класса:
пишу
а дальше че-то не доганяю, подскажите пожалуйста заранее большое спасибо! с меня + |
| Автор: baldina 16.5.2008, 13:21 | ||
| ну во первых cstring &obj не const - туда же записывается. проще всего - через std::string
|
| Автор: anatox91 16.5.2008, 13:30 |
| про конст забыл через std::string я то знаю что можно сделать, интересно можно ли это сделать без классов типа std::string, CString |
| Автор: baldina 16.5.2008, 13:40 |
| можно. вызывай в цикле in.getline () с временным буфером, перераспределяй память и копируй в свой char* |
| Автор: anatox91 16.5.2008, 13:52 |
| ясно, попробую |
| Автор: anatox91 16.5.2008, 18:34 | ||
| короче решил для начала написать функцию , которая добавляла бы в конец строки другую строку, чтобы меньше было возни с перераспределением памяти, вроде работает нормально, но почему-то всегда в конец добавляет символ пробела вот код:
и еще. baldina, я только не понимаю, какое тогда условие задать для цикла? |
| Автор: bsa 16.5.2008, 21:10 |
| anatox91, а зачем ты лишний раз память выделял и освобождал? Кто тебе мешал сразу под buf выделить память, необходимую для хранения результирующей строки (строка 13). Тогда бы тебе не нужно было делать строки 19-23 |
| Автор: anatox91 16.5.2008, 22:07 | ||
bsa, ты имел ввиду что-то типа такого ?
|
| Автор: bsa 16.5.2008, 22:23 |
| anatox91, да. |
| Автор: bsa 16.5.2008, 23:01 |
| anatox91, getline() читает строку до тех пор, пока не будет достигнут конец строки, конец файла, либо не заполнится предоставленный буфер. |
| Автор: opjox 17.5.2008, 21:25 | ||
[+] выделение памяти и копирование происходит только один раз [-] данная реализация не обращает внимания на символы-разделители, читает все скопом в память |
| Автор: opjox 17.5.2008, 21:54 | ||||
пофиксил:
|
| Автор: anatox91 18.5.2008, 10:38 | ||||||||||||
| чет не работает после ввода строки сразу закрывается прога:
и если так, то тоже не выводит ничего после ввода:
кстати а разве катит простой ноль в конце:
вместо этого
? |
| Автор: bsa 18.5.2008, 12:20 | ||||||||
катит. Но лучше типизировать (т.е. использовать '\0'), имхо. |
| Автор: anatox91 18.5.2008, 19:37 |
| а почему не работает пример opjox'a можете подсказать? вроде разобрался в его примере и по-моему все должно работать... но не работает... |
| Автор: opjox 18.5.2008, 19:58 | ||||
'\0' – подчеркнет тип, но, имхо, для глаза 0 приятнее выглядит. На нижнем уровне присвоение будет выполнено одинаково.
Засада сидит в строчке:
если код собран с помощью g++, то для потока std::cin функция in_avail упорно возвращает 0, даже несмотря на то, что в буфере есть данные. Причем, на VS2008 код работает на ура. Чтобы все заработало, надо в len занести кол-ва данных в буфере. Или же модифицировать механизм поиска разделителя. Сейчас будет хоккей |
| Автор: anatox91 18.5.2008, 21:56 |
| попробовал, действительно на визуалке все фурычит, а на MinGW не хочет... opjox, спасибо кстати, очень интересные функции узнал, + |
| Автор: opjox 20.5.2008, 00:18 | ||
| В силу обстоятельств Решить проблему так и не смог. Попробовал найти замену in_avail(), но тщетно. Потом решил пойти другим путем – пройтись по всему буферу до разделителя или до окончания данных. Тут уже все пошло лучше и даже удалось написать рабочий код для VS2008:
Но у этого кода есть проблема: если мы достигнем не разделителя, а конца данных, то тогда происходит сброс всего буфера, из-за чего все данные в нем теряются. Но для g++ оказалось всю намного хуже и без этого. Функция sungetc отрабатывала всего один раз, а остальные вызовы игнорировались. Из-за этого не удается достич начала данных. Похоже, придется отказаться от этого варианта, не вижу я пока больше способов решения проблем этого пути. |
| Автор: baldina 20.5.2008, 07:23 | ||||
Что-то кажется мне с getline() попроще будет. Пусть даже и с неоднократным выделением памяти: производительность тут имхо не слишком важна ибо
|
| Автор: anatox91 20.5.2008, 17:51 |
| всем спасибо, решил все-таки через string пусть будет хотя конечно странно что пример opjox'а не работает в MinGW, но в VS2008 работает... |