POSIX.1 getline()
(man 3 getline
) доступно почти во всех библиотеках C операционных систем (единственное исключение, о котором я знаю, это Windows). Цикл для чтения строк любой длины:
char *line_ptr = NULL;
size_t line_max = 0;
ssize_t line_len;
while (1) {
line_len = getline(&line_ptr, &line_max, stdin);
if (line_len == -1)
break;
/* You now have 'line_len' chars at 'line_ptr',
but it may contain embedded nul chars ('\0').
Also, line_ptr[line_len] == '\0'.
*/
}
/* Discard dynamically allocated buffer; allow reuse later. */
free(line_ptr);
line_ptr = NULL;
line_max = 0;
Существует также связанная функция getdelim()
, которая принимает дополнительный параметр (указанный перед потоком), используемый в качестве маркера конца записи. Это особенно полезно в средах Unixy / POSIXy при чтении имен файлов, например, из стандартный ввод, так как вы можете использовать сам nul ('\0'
) в качестве разделителя (см., например, find -print0
или xargs -0
), что позволяет правильно обрабатывать все возможные имена файлов.
Если вы используете Windows или если у вас есть текстовые файлы с различными соглашениями новой строки (не только '\n'
, но любой из '\n'
, '\r'
, "\r\n"
или "\n\r"
), вы можете использовать мой getline_universal()
Реализация функции из другого моего ответа. Он отличается от стандартных getline()
и fgets()
тем, что новая строка не включена в возвращаемую строку; он также остается в потоке и используется / игнорируется вызовом next на getline_universal()
. Если вы используете getline_universal()
для чтения каждой строки в файле или потоке, он будет работать как положено.