Comments 4
Если вы посмотрите на исходный текст настоящей утилиты cat, то обнаружите, что это достаточно сложная штука, использующая ряд системных трюков ради обеспечения высокой производительности. Реальный cat будет быстрее вашей посимвольнрй программы на больших файлах во много раз, и в этом его и фишка. Так что зря вы использовали такой претециозный заголовок.
Помнится, что-то подобное нужно сделать в одной из школ программирования. Как раз таки знакомит с понятием "утилиты командной строки". В ответ предыдушему комментарию, скажу, что при собственной реализации осознание сложности оригинальной утилиты становится очевидным, там реализован гораздо больший функционал...
Конечно, неплохо бы посмотреть на полный код, возможно вы как-то странно надёргали куски кода.
Потому что по представленным фрагментам есть несколько проблем:
FILE *f = fopen(name, "r");
// открываем файл
int c;
while ((c = fgetc(f)) != EOF) {
fopen может вернуть NULL, если не смог открыть файл (файла нет, прав нет, ещё чего-нибудь нет). И тогда, как говорят интернеты, вызов fgetc это UB!
The
fgetc()
function in C expects a validFILE*
pointer as its argument, representing the stream from which to read a character. Providing aNULL
pointer as thestream
argument tofgetc()
constitutes an invalid parameter.According to the C standard, passing a
NULL
pointer to a function that expects a valid pointer results in undefined behavior. This means the program's behavior is unpredictable and may vary depending on the compiler, operating system, and execution environment.
---
Судя по приведённому коду
if (c == '\n' && prev_ch == '\n') {
empty++;
...
if (flags.s && empty > 1) {
prev_ch = c;
у вас prev_ch всегда будет равен \n после первого назначения (т.к. empty > 1 только для c == '\n').
В общем, обновлять prev_ch нужно всегда без дополнительных условий. Иначе вы рискуете после небольшого рефакторинга или других правок получить изменение логики.
Надеюсь, у вас в коде написано всё правильно и корректно обновляется.
Реализация утилиты cat на языке C