All streams
Search
Write a publication
Pull to refresh

Comments 10

Если вы посмотрите на исходный текст настоящей утилиты 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 в студию!

В какой-то момент в моем поле появилась задачка: написать две утилиты линуксоидного существа cat и grep. Несмотря на то, что они кажутся довольно простыми, 

Серьёзно?! grep и регулярные выражения кажутся чем-то простым для реализации?!

Здесь как раз я беру его для поддержки больших флагов.

Чего? Это вам нейросеть нагаллюцинировала?

У каждой вещи - свое предназначение.

У яблока - быть съеденным.

А основное назначение утилиты cat - делать конкатенации файлов. Ее название говорит об этом. (Con-cat). А вывод на экран - это просто side effect которым мы привыкли пользоваться.

спасибо за статью интересный челлендж, у системы есть потоки, если аргумент просто файл то мы показываем файл тоесть читаем и показываем в out, если есть перенаправление тут я не знаю хитростей(возможно они есть я про '>' эту возможность) -> в этом случае мы захватив in показывая его в out по ^C пишем в файл в который есть перенаправление '>' (наверняка там есть возможно что-то с IPC )

cat это захват(наверно) и перенаправление потоков поидее это тех, которые системные поидее, тоесть мини управление потоками чтобы создать файл или показать его на екране терминала, потомучто когда она была создана компы были ближе к терминалам поидее

на более простом уровне

manage string='\0'

if(file) {
 read(file) 
 write(OUT)
}
else if('>' file){ 
 while(!EOF){
  if(EOF) { 
   stringAppend('\0') 
   write(file) 
   close() 
  }//stringAppend write to file
  
  read(IN) 
  write(OUT) 
  stringAppend(fromIN)
 }
}

Классная статья для вдохновления использовать язык C в своих проектах.
Все-таки он позволяет существенно ускорить примитивные операции по сравнению с другими языками программирования как Python, Java и прочие, например, обработку текста.
Все-таки не зря многие популярные языки имеют инструменты и модули написанные именно на нем)
Понимаю, что надо учитывать много нюансов и по одному опыту нельзя называть его серебряной пулей, но все же и забывать о нем тоже не стоит.

Надеюсь, что будет еще одна похожая статья, но для решения более прикладных задач
Например, интересно посмотреть на C для разработки собственных модулей под Python, модулей под веб-сервер apache2 или банально написать какой-то скрипт на сервер на примере BASH-скриптов и сравнить производительность)

(Сам был в Школе 21 и очень горжусь этим, так как это сообщество развивает и помогает рассмотреть и изучить больше, чем HOW-TO DO THIS AND THIS, помогает понять, что программирование в целом окружает тебя по всюду)

еще идея, так как числа и строки в 1 месте в консоли, чем это плохо, при выделении числа строк будут попадать в текст, и если строк много долго фиксить, можно тогда такой cat с идеей как у вас кинуть в raw режим терминала с подсветками и кнопками, там тоже управляющие символы, но они рисуют интерфейс

Sign up to leave a comment.

Articles