В конец должно быть требуется записать 0. Malloc не обнуляет выделенную память?
Найти подстроку strstr. Если найдено, копировать strcpy в выходной буфер или сразу в файл начало, затем замену и т.д. Затем копировать оставшийся конец. При работе с буфером следует предусмотреть realloc при переподнении. Если задача ограничена одним вхождением, одной заменой первого вхождения, можно изначально выделить буфер размером filesize + newsubstrlen - oldsubstrlen, перепестить (memmov или strmov, если последнее есть) конец строки и копировать memcpy строку в середину.
А почему вывод не на си?