эквивалент fgets в буфере? - PullRequest
       13

эквивалент fgets в буфере?

5 голосов
/ 17 сентября 2011

Первоначально я разбирал файл построчно, используя fgets().

Теперь я изменил все так, что у меня уже есть весь файл в буфере. Я все еще люблю читать этот буфер построчно для разбора. Есть ли что-то, разработанное для этого, или мне нужно сделать цикл, который проверяет на 0x0A char с в этой точке?

Ответы [ 4 ]

6 голосов
/ 17 сентября 2011

memchr (с небольшим количеством вашего собственного кода оболочки, оканчивающегося на memcpy) является точным эквивалентом - подобно fgets требуется максимальная длина, которую он будет обрабатывать (должен быть минимум оставшегося входного буфера размер и размер вашего выходного буфера) и сканирует, пока он не достигнет нужного символа (который будет '\n') или не исчерпает пространство ввода / вывода.

Обратите внимание, что для данных, уже находящихся в буфере в памяти, вы, возможно, захотите пропустить этап копирования в отдельный выходной буфер, если только вам не нужно завершать нулем вывод без изменения ввода. Многие начинающие программисты на С часто совершают ошибку, думая , что им нужно нулевое завершение, когда достаточно просто улучшить некоторые из ваших интерфейсов, чтобы получить пару (указатель, длина) , что позволяет вам передавать / обрабатывать подстроки без их копирования. Например, вы можете передать их на printf используя: printf("%.*s", (int)length, start);

2 голосов
/ 17 сентября 2011

Для этого вы можете использовать функцию sscanf.Если вам действительно нужна целая строка, что-то вроде этого должно сработать:

sscanf(your_buffer, "%50[^\n]", line);

(Это будет читать строки длиной не более 50 символов. Как всегда, будьте осторожны с ограничителями длины и 0. Ипроверьте возвращаемое значение sscanf в случае, если что-то пошло не так.)

Вы можете использовать арифметику указателей для перемещения вашего буфера (просто добавьте «возвращенную» длину строки + 1).

0 голосов
/ 17 сентября 2011

Если вы ищете функции C, strtok() и strsep() будут разделять строку на указанный символ.

0 голосов
/ 17 сентября 2011

Существует sscanf, который может или не может работать для вас.

...