LINUX.ORG.RU

Как правильно вычитывать строки из потока?

 


0

4

Под потоком подразумевается сокет, последовательный порт и т.д..

Есть куча протоколов общения, которые подразумевают общение строками, длина которых заранее не известна. Насколько я знаю, есть 2 подхода. Первый подход заключается в чтении по одному байту до тех пор, пока не встретится конец строки. Второй подход заключается в чтении какого-то произвольного числа байт в некий буфер и уже проход по буферу.

Первый вариант хорош своей простотой, но плох большим количеством вызовов read()/recv(). Второй вариант хорош тем, что число вызовов read()/recv() будет минимально, но плох тем, что можно вычитать более одной строки и тогда вокруг данных после конца строки начинается пляска с бубном.

Как вообще принято реализовывать подобные вещи?

★★

Первый подход заключается в чтении по одному байту до тех пор, пока не встретится конец строки. Второй подход заключается в чтении какого-то произвольного числа байт в некий буфер и уже проход по буферу.

В 99% случаев существенной разницы между этими подходами нет. сеть, USB, даже всякие UART, SPI и I2C данные присылают пакетом, и этот пакет по-любому сохраняется в буфере. recv/read в случае чтения по одному байту из девайса просто читают из этого буфера, а не дёргают железо на каждый чих. Оверхед разве что в сисколлах. Если не гигабиты. то в общем-то не будет заметно.

Разве что RS232 с flow control может отдавать байты по одному, но нынче использование flow control редкость даже для RS232.

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

У меня буфер один достаточного размера для того, чтоб вместить целиком всю строку. Если за один раз не удалось вычитать строку до конца, то при следующем чтении передаётся указатель со смещением. Таким образом в моём коде описанная ситуация невозможна.

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

после обработки первой строки есть проверка, обработан ли буфер до конца. если нет, то содержимое бфера за концом строки перемещается в начало буфера и продолжается чтение по смещению. Вот код Как правильно вычитывать строки из потока? (комментарий)

u5er ★★
() автор топика