fputs() schreibt nur Strings, die mit x'00' beendet sind.
fgets() liest bis zum CRLF bzw. Dateiende, ggf. mit "Pufferüberschreibung" (bekannte M$-Sicherheitslücken) wenn der Eingabepuffer zu kurz ist.

read() ist da allemal sicherer.

Ansonsten gilt natürlich:
Gibst du in ASCII/ANSI direkt aus, so sind die Codes x'0D0A' (in EBCDIC eben x'0D25') selber auszugeben.