|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Доброго времени суток господа. Пишет вам человек, который слишком долго занимался VBA. Но речь не о том зачем это и как с этим бороться. Речь и сложности восприятия концепции, что теперь казавшийся ранее простецкий string не так прост и с массивами в контексте VBA тоже всё было беззаботно. Но теперь нужно понимать и уметь реализовывать весь этот функционал в C++ без использования соответствующих библиотек. Только char, указатели и работа с памятью. Может что ещё забыл упомянуть. Пытаюсь решить в образовательных целях следующую задачку: Считываю поток ввода посимвольно пока не достигну конца потока и возвращаю C-style строку с прочитанными символами. В процессе чтения каждый раз перевыделяю память. Память возвращаемая из функции *getline() и *resize(...) будет освобождена оператором delete[]. Я как то не правильно подаю данные на вход в resize потому, что когда доходит дело до delete[], программа перестаёт выполняться корректно. Подскажите пожалуйста в чём я неправ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 07:20 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
строка в C/C++ в классическом ее понимании всегда должна заканчиваться нуль-терминатором, то есть у вас не может быть по определению Код: plaintext 1. 2.
надо так, хотя бы: Код: plaintext 1. 2. 3.
но лучше на 1 символ + нуль-терминатор: Код: plaintext 1. 2. 3.
В противном случае вы выделяете память в ноль байт и пытаетесь с ней работать. Зачем ? Намного лучше и эффективнее с точки зрения производительности сократить обращения к менеджеру памяти и копирование до минимума, то есть изначально выделить некоторую область памяти и использовать ее пока она не будет исчерпана. Например, выделяем память на 10 символов + нуль-терминатор: Код: plaintext 1. 2. 3. 4.
По мере заполнения выделенного буфера, вы уменьшаете счетчик szMemLeft и когда он достигнет отметки 0, а символ \n еще не найден, наступает момент перенести содержимое из старого буфера в новый и переинициализировать szMemLeft и szMemSize. Новый буфер опять же лучше выделять сразу больше, например, удвоенного размера по сравнению с предыдущим, чтобы не выделять память под обному байту. Для копирования участков памяти из старого буфера в новый лучше использовать memcpy_s, а не самописный цикл ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 08:42 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Cerebrum, Спасибо! Успел и сам понять: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 08:52 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Cerebrum, По поводу последнего абзаца с кодом и пояснением отдельное спасибо! А так мне надо было решить задачку по работе с памятью именно в С++ стайл. А это операторы New+Delete и New[]+Delete[] Ваше пояснение, как я понимаю, имеет отношение к C-стайлу (malloc, realloc, calloc, free). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 09:01 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
MAGRAVА так мне надо было решить задачку по работе с памятью именно в С++ стайл. А это операторы New+Delete и New[]+Delete[] Ваше пояснение, как я понимаю, имеет отношение к C-стайлу (malloc, realloc, calloc, free). Где ты там увидел у него malloc/free? "Получить тормоза на ровном месте" это вовсе не "С++ стайл". Я бы (принимая во внимание современные реалии) выделял память по килобайту, не меньше. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 10:31 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
ИМХО если уж "С++ style", то используй std::vector . Если "С style", то никаких new, delete, cin, т.к. это С++. Зато в С есть realloc() ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 10:44 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
По-хорошему просто взять std::string и не заниматься велосипедостроением ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 10:49 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Dima TПо-хорошему просто взять std::string и не заниматься велосипедостроением +1 ну или: Код: plaintext 1.
IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 11:01 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
MAGRAV, ты уж определись что тебе по настоящему надо. С-style - это достаточно низкоуровневое программирование где нет iostream. Вот посмотри как в сях работают с файлами. Там файловые указатели FILE *, handles. У тебя - какой-то микс С/C++. И правильно пишут дескыть - бери std::string. Бери и используй. Чего-тебе еще? P.S. Вобщем... или трусы надень. Или крест сними. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 14:15 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
MAGRAV, Одна из проблем в коде: Код: plaintext 1.
В выделенном должно быть &&. А иначе только правая часть от "," ограничивает цикл, и при расширении строки вы читаете за пределами выделенного блока памяти, а при сокращении - пишете за его пределами (первое - возможный крэш, второе - гарантированно либо крэш либо поврежденная куча). Ну а в целом перевыделять память каждый раз всего на один байт больше это перебор. Если заранее размер не извествен, то выделять нужно в N раз больше чем предыдущий размер. N например 2 (но могут быть и другие). И начальный размер ставьте какой-нибудь разумный типа 16 или даже 256. Потому что строка эта скорее всего короткоживущая, и лучше сократить кол-во выделений памяти чем экономить несколько сотен байт. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 15:11 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Ну и: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Извините за. ЗЫ. Хотя в образовательных целях полезно, как вы, извращаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 15:18 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
В тему статических анализаторов. Недавно в форуме появлялся один господин который парил нам PVS-Studio. Анализатор должен был среагировать на странное появлении операции запятая в условии цикла. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 18:42 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Dima TПо-хорошему просто взять std::string и не заниматься велосипедостроением +1000000 нифига не понял, зачем писать велосипед ... |
|||
:
Нравится:
Не нравится:
|
|||
30.06.2019, 21:51 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухнифига не понял, зачем писать велосипедну, например, с чем я последним столкнулся (пока 11-е не вышли) - невозможно передавать в конструктор строки "всё подряд", например чиселки, чтобы на выходе получать строку из числа. int 14 -> "14". А, так да, после VB, где среда за всем бдит сама, трудно самому следить за деталями ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 05:54 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
CEMb, для этого не нужно писать новую ф-ю string уже опять же всё написано до нас: Код: plaintext 1.
ИЛИ Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 13:00 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухCEMb, для этого не нужно писать новую ф-ю string уже опять же всё написано до нас: Сказано же было "пока 11-е не вышли" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 17:56 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Пора на Haskell переходить. Не? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:20 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyполудухCEMb, для этого не нужно писать новую ф-ю string уже опять же всё написано до нас: Сказано же было "пока 11-е не вышли" они вышли 8 лет назад так мы и C начнём вспоминать, какой там был ад здесь современная ситуация, где человек пришёл изобретать велосипед в 2019 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:36 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
maytonПора на Haskell переходить. Не? он медленнее ( ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:36 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
maytonПора на Haskell переходить. Не?c C++ не переходють). Тут очень близко к железу. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 19:52 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухmaytonПора на Haskell переходить. Не? он медленнее ( Возможно. Просто тут смотрю … борьба за красоту кода идет. Вот и вспомнил к месту. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 20:02 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудухтак мы и C начнём вспоминать, какой там был ад Ад будет когда приходишь в проект, а там никто с указателями не умел работать, и тебе это разгребать ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 22:37 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, На старые проекты (легаси) наценки)) и молоко за вредность. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 23:09 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
"переходить" надо на клеточное программирование, вот куда надо стремиться все эти груды железа ничто, по сравнению с маленькой точкой, которую мы всего 60 лет назад ещё толком разглядеть не могли это самый совершенный ИИ из доступных нам и он в "открытом доступе" ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 23:24 |
|
Реализация функции getline, для считывает потока ввода посимвольно посредством resize
|
|||
---|---|---|---|
#18+
полудух"переходить" надо на клеточное программирование, вот куда надо стремиться все эти груды железа ничто, по сравнению с маленькой точкой, которую мы всего 60 лет назад ещё толком разглядеть не могли это самый совершенный ИИ из доступных нам и он в "открытом доступе" Я так понимаю... дело в шляпе. Остался пустяк. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2019, 23:26 |
|
|
start [/forum/topic.php?fid=57&msg=39832461&tid=2017602]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 176ms |
0 / 0 |