#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; }