Комментарии 22
Каждый символ искать флаги за O(n) это сильно
Кажется, в реальности автора отменили функцию getopt.
Как и 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.
putc(c);
Наверное тут нужно либо stdout указать, либо putchar использовать.
int putc(int c, FILE *stream);
int putchar(int c);
Для struct s_avi_flags avi_flags[8] префикс const не нужен? А может этот массив глобальным сделать? Зачем стек нагружать?
Кстати, а как потом назад из каретной и M- нотаций получить исходные бинарные данные? Есть ли какие-то стандартные Unix утилиты для этого?
Вопрос, зачем изобретать велосипед в виде void flags_parser если можно использовать хорошую и десятилетиями отлаженную функцию getopt из unistd.h?
for (int i = index_end_flags + 1; i < argc, i++) {
Уж проверить свои примеры кода на банальные опечатки перед публикацией, наверное, можно было?
Реализация утилиты cat на C