Как стать автором
Обновить

Комментарии 22

Каждый символ искать флаги за O(n) это сильно

Ну кто сказал, что проект на этом остановится) Для начального проекта, для человека который только только начал писать на си это уже хорошо

Кажется, в реальности автора отменили функцию getopt.

Как и feof

Каким боком здесь может понадобиться функция feof? feof - очень нишевая и специальная функция, которая практически не используется в программах на С. Поэтому не совсем ясно, к чему вы тут упомянули feof.

человек же написал: учится. Соответственно, ещё только в начале пути :)

Рискну предположить, что автору запрещено использовать getopt, потому что он пребывает в реальности под названием «Школа 21».

Эта реальность называется языком С. В языке никакого getopt нет и никогда не было. Это чистый пингвинизм, в этой задаче, разумеется, ни в коем случае не допустимый.

Блочное чтение и печать сделайте (fgets/puts), Грета Тунберг негодует.

Тогда лучше splice(2) , чтобы вообще избежать копирования в "user space", а потом обратно. И кстати можно включить буферизацию для "FILE" с помощью setvbuf(3), тогда fgetc не будет обращаться к ОС за каждым байтом.

splice(2) — чистый пингвинизм, а человек вроде как пытается в рамках ISO/IEC 9899 держаться. Правда, это не мешает ему указывать в режиме открытия файлов чистый виндизм "t", но студента можно понять, пожурить и простить :)

Что до setvbuf(3), то я со своим, нескромно замечу, опытом С-программирования для 11 ОС, ещё не встречал таковой, в которой бы FILE по умолчанию открывался не block buffered, кроме stdout, который обычно line buffered, и stderr, который unbuffered.

Ни в коем случае. Режим 't' - канонический С, растущий из начала времен. Указание режима 't' при работе с текстовыми потоками - обязательная практика, тщательно выдерживаемая везде и всегда.

putc(c);

Наверное тут нужно либо stdout указать, либо putchar использовать.

       int putc(int c, FILE *stream);
       int putchar(int c);

Для struct s_avi_flags avi_flags[8] префикс const не нужен? А может этот массив глобальным сделать? Зачем стек нагружать?

Ну, глобальным-то зачем? Достаточно static.

Что до const, он там не то чтобы нужен, но может оказаться весьма полезным, от компилятора и execution environment зависит.

Использование const обязательно и никаким образом не зависит от компилятора, и уж тем более от execution environment.

Кстати, а как потом назад из каретной и M- нотаций получить исходные бинарные данные? Есть ли какие-то стандартные Unix утилиты для этого?

А как бы “какая-нибудь стандартная unix-утилита” могла понять, что прочитанное ею"^I" является именно "\t", а не "^I"? А никак :)

Вопрос, зачем изобретать велосипед в виде void flags_parser если можно использовать хорошую и десятилетиями отлаженную функцию getopt из unistd.h?

Потому что программа, как ясно сказано изначально, написана на стандартом С, в котром нет никакого getopt. Не надо замусоривать программирование пингвинизмами.

for (int i = index_end_flags + 1; i < argc, i++) {

Уж проверить свои примеры кода на банальные опечатки перед публикацией, наверное, можно было?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории