There's absolutely no need for an intermediate (dynamic) buffer. Everything you do can be done directly in the client buffer (Buf
).
I don't see a reason for fread
-ing data. fgets
works as good, and spares you from calling ftell
and fseek
.
The way you remove null chars is suboptimal. I'd keep count of null chars encountered, and shift non-null chars by that count, in a single loop. In any case, I'd factor removal code into a separate function (No Raw Loops rule strikes again).
Looking for a newline is better be done with a standard memchr()
.
That said, the main code condenses to
char * fgets_and_remove_nulls(char * buf, size_t count, FILE * fp)
{
memset(buf, 0, size);
if(fgets(buf, size, fp) == NULL) return NULL;
char * end = memchr(buf, '\n', size);
if (end == NULL) end = buf + size;
remove_null_chars(buf, end);
return buf;
}