как печатать номера строк из нескольких файлов без использования fgets

#c #fgetc #putchar

#c #fgetc #путчар

Вопрос:

введите описание изображения здесьЯ пытаюсь печатать номера строк в начале строк, не используя fgets() да, он хорошо печатает номер строки, когда я ввожу несколько файлов, но я хочу получить такой результат. Ребята, вы можете мне в этом помочь?

Теперь результат

 1 I'll always remember 2 the day we kiss my lips 3 4 light as a feather *5 ####@localhost ~ $*  

ожидайте результата

 1 I'll always remember 2 the day we kiss my lips 3 4 light as a feather *####@localhost ~$*  

Вот мой код:

 #include lt;stdio.hgt;  int main(int argc, char *argv[]) {  FILE *fp;  int c, n;  n = 1;  for (int i = 1; i lt; argc; i  ) {  if (argc lt; 2)   fp = stdin;   else  fp = fopen(argv[i], "r");   c = getc(fp);   printf("%d ", n);  while (c != EOF) {   putc(c, stdout);   if (c == 'n')  n  , printf("%d ", n);  c = getc(fp);  }  fclose(fp);  }  return 0; }  

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

1. Более полезно публиковать текст как текст.

Ответ №1:

Не пишите printf("%d ", n); , когда вы не знаете, есть ли следующая строка. Или, в противном случае, делайте printf("%d ", n); это только в начале файла и после новой строки, когда вы знаете, что есть следующий символ.

 #include lt;stdbool.hgt; // for bool, true, false     bool previous_character_was_a_newline = true;  while ((c = getc(fp)) != EOF) {   if (previous_character_was_a_newline) {  previous_character_was_a_newline = false;  printf("%d ", n);  }  putc(c, stdout);   if (c == 'n') {  n  ;  previous_character_was_a_newline = true;  }  }  

Не пишите такой код n , printf("%d ", n); , это будет сбивать с толку. Сильно предпочитаю:

 if (c == 'n') {  n  ;  printf("%d ", n);  }  

Ответ №2:

Ваша реализация выводит номер строки перед первой строкой и после каждой новой строки, в том числе в конце файла. Это приводит к появлению дополнительного номера строки в конце файла.

Давайте более точно определим результат:

  • вам нужен номер строки в начале каждой строки, без вывода, если нет строки, без номера строки после последней строки.
  • вы хотите, чтобы счетчик строк сбрасывался 1 при чтении нового файла? Я предполагаю, что нет, но cat -n делает.
  • вы хотите вывести дополнительную новую строку в конце непустого файла, который не заканчивается новой строкой? Я предполагаю, что да, но cat -n это не так.

Вот модифицированная версия, в которой ответ » нет «на первый вопрос и» да » на второй:

 #include lt;stdio.hgt;  int output_file(FILE *fp, int line) {  int c, last = 'n';  while ((c = getc(fp)) != EOF) {  if (last == 'n') {  printf("%dt", line  );  }  putchar(c);  last = c;  }  /* output newline at end of file if non empty and no trailing newline */  if (last != 'n') {  putchar('n');  }  return line; }  int main(int argc, char *argv[]) {  int n = 1;   if (argc lt; 2) {  n = output_file(stdin, n);  } else {  for (int i = 1; i lt; argc; i  ) {  FILE *fp = fopen(argv[i], "r");  if (fp == NULL) {  perror(argv[i]);  } else {  n = output_file(fp, n);  fclose(fp);  }  }  }  return 0; }