Search
Write a publication
Pull to refresh

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 valid FILE* pointer as its argument, representing the stream from which to read a character. Providing a NULL pointer as the stream argument to fgetc() 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 нужно всегда без дополнительных условий. Иначе вы рискуете после небольшого рефакторинга или других правок получить изменение логики.

Надеюсь, у вас в коде написано всё правильно и корректно обновляется.

Поддерживаю! Ссылку на GitHub в студию!

Sign up to leave a comment.

Articles