Размещение большого количества кода здесь не годится, так как у OP
считается обманом (у меня есть экзамены), потому что это не мой код.
Итак, несколько советов
Я НЕ знаю, какова будет длина строки, поэтому я не могу иметь постоянный размер буфера.
Защитное программирование предполагает разумную верхнюю границу для предотвращения хакерских атак. IAC, при чтении текстовых файлов экологические ограничения .
Экологические ограничения
Реализация должна поддерживать текстовые файлы со строками, содержащими не менее 254 символов, включая завершающий символ новой строки. Значение макроса BUFSIZ
должно быть не менее 256. C11 §7.21.2 7
При таком подходе:
#include <stdio.h>
#define SANE_BOUND (BUFSIZ+1)
char* readLine(FILE *line) {
char buffer[SANE_BOUND];
if (fgets(buffer, sizeof buffer, line) == NULL) {
return NULL;
}
return strdup(buffer);
}
Как упростить эту readLine()
функцию?
Для ясности, код, который вы не хотите копировать, имеет проблем .
Исправления
// char is insufficient to distinguish the 257 different results from fgetc()
// char individualChar;
int individualChar;
// Use size_t for sizing, `int` may be too small
size_t pos = 0;
size_t size = 16;
Если первый fgetc()
возврат вызова EOF
или более поздний возврат вызова EOF
из-за редкой ошибки ввода, функция должна вернуть NULL
.
Бросьте броски, не нужно.
//char *buffer = (char *)malloc(size);
//char *tmp = (char *)realloc(buffer, size);
char *buffer = malloc(size);
char *tmp = realloc(buffer, size);
Почему неполный чек?
Код имеет if (!tmp){
, но нет предварительной проверки для if (!buffer){
Minor
// Use \n and stay case correct
// fprintf(stderr, "Realloc failed");
fprintf(stderr, "realloc() failed\n");
Pedantic
size *= 2;
может переполниться. Насколько безопасным ты хочешь быть?
Дизайн
Я бы правильный размер с окончательным realloc()
.
Я бы перепроектировал, чтобы передать вызывающей стороне как считанный размер, так и выделенную память. Текстовый файл lines необычно может содержать нулевой символ , и возвращение только указателя string не означает, что некоторые из них были прочитаны. Относится и к этому кейсу .
A хорошо выделение readLine()
будет менее простым, чем опубликованный код OP.