ввожу флаг b и e. Он некорректно отображает. 

Вот код: [#include "s21_cat.h"

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
  int flag_error = 0;

  flags flags = {0};
  char *filename = NULL;

  if (read_flags(argc, argv, &flags, &filename) != 0) {
    flag_error = 1;
    printf("n/a");
  } else if (filename == NULL) {
    printf("n/a");
    flag_error = 1;
  } else {
    if (process_file(filename, &flags) != 0) {
      printf("n/a");
      flag_error = 1;
    }
  }
  return flag_error;
}

int read_flags(int argc, char *argv[], flags *flags, char **filename) {
  int i;
  for (i = 1; i < argc; i++) {
    if (strcmp(argv[i], "-b") == 0 ||
        strcmp(argv[i], "--number-nonblank") == 0) {
      flags->b = 1;
    } else if (strcmp(argv[i], "-e") == 0) {
      flags->e = 1;
      flags->v = 1;
    } else if (strcmp(argv[i], "-E") == 0) {
      flags->E = 1;
    } else if (strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "--number") == 0) {
      flags->n = 1;
    } else if (strcmp(argv[i], "-s") == 0 ||
               strcmp(argv[i], "--squeeze-blank") == 0) {
      flags->s = 1;
    } else if (strcmp(argv[i], "-t") == 0) {
      flags->t = 1;
      flags->v = 1;
    } else if (strcmp(argv[i], "-T") == 0) {
      flags->T = 1;
    } else if (strcmp(argv[i], "-v") == 0) {
      flags->v = 1;
    } else if (argv[i][0] != '-') {
      *filename = argv[i];
      break;
    } else {
      return 1;
    }
  }

  //   if ((flags->e || flags->t) && !flags->v) {
  //     return 1;
  //   }

  return 0;
}

int process_file(const char *filename, flags *flags) {
  int return_flag = 0;

  FILE *file = fopen(filename, "r");
  if (!file) {
    return_flag = 1;
  } else {
    char line[1024];
    int line_number = 1;
    int previous_empty = 0;

    while (fgets(line, sizeof(line), file)) {
      int is_empty_line = (line[0] == '\n');

      if (flags->s && is_empty_line) {
        if (previous_empty) continue;
        previous_empty = 1;
      } else {
        previous_empty = 0;
      }

      if (flags->b && !is_empty_line) {

      
        if (!is_empty_line) {
                    printf("%6d\t", line_number++);
                } else {
                    printf("      \t");
                }
      }
      else if (flags->n)
        printf("%6d\t", line_number++);

      if (flags->t) {
        for (int i = 0; line[i] != '\0'; i++) {
          if (line[i] == '\t') {
            printf("^I");
          } else {
            putchar(line[i]);
          }
        }
      } else {
        size_t len = strlen(line);
        if (flags->e && len > 0 && line[len - 1] == '\n') {
          fwrite(line, sizeof(char), len - 1, stdout);  // Выводим без '\n'
          printf("$\n");
        } else if (flags->e && len > 0 && line[len - 1] != '\n') {
          // Строка не заканчивается '\n', выводим без изменений
          printf("%s", line);
        } else {
          // Если флаг -e не установлен, выводим строку как есть
          printf("%s", line);
        }
      }
    }
    fclose(file);
  }
  return return_flag;
}]

какой вывод (     1	Hello!$
$
     2	sdfdsfdsf$
$
     3	    wfsdfsdfsdfsdfdsf$
$
$
$
$
     4	    !)


каким он должен быть (     1	Hello!$
      	$
     2	sdfdsfdsf$
      	$
     3	    wfsdfsdfsdfsdfdsf$
      	$
      	$
      	$
      	$
     4	    !)