Как я могу вставить символ в начале строки, а не в конце? - PullRequest
0 голосов
/ 29 января 2020

Я новичок в C, и, по сути, я пытаюсь прочитать файл char с помощью char и вывести символы на вывод, но также, в начале каждой строки, указать номер строки. Мне удалось выяснить, как считать строки, но когда я пытаюсь вставить номер строки, я не могу понять, как заставить его вставить следующую строку, а не сразу после встречи с новой строкой.

Вот мой код:

int main() {
    int c, nl;

    nl = 1; 
    FILE *file;
    file = fopen("testWords.in", "r");

    if (file) {
        printf("%d. ", nl);
        while((c = getc(file)) != EOF) {
            if (c == '\n') {
                ++nl;
                printf("%d", nl);
            }
            printf("%c", c);
        }
        fclose(file);
    }
}

А вот и вывод:

1. The Three Laws of Robotics:2
First: A robot may not injure a human being or, through inaction,3
   allow a human being to come to harm;4
Second: A robot must obey the orders given it by human beings5
   except where such orders would conflict with the First Law;6
Third: A robot must protect its own existence as long as7
such protection does not conflict with the First or Second Law;8
The Zeroth Law: A robot may not harm humanity, or, by inaction,9
    allow humanity to come to harm.10
    -- Isaac Asimov, I, Robot11

Ответы [ 2 ]

2 голосов
/ 29 января 2020

Я полагаю, что вы хотите напечатать символ новой строки \n, прежде чем печатать номер строки. Вы можете исправить это, просто переместив строку печати над оператором if.

int main(void) {
    int c, nl;

    nl = 1; 
    FILE *file;
    file = fopen("testWords.in", "r");

    if (file) {
        printf("%d. ", nl);
        while((c = getc(file)) != EOF) {
            printf("%c", c);
            if (c == '\n') {
                ++nl;
                printf("%d", nl);
            }
        }
        fclose(file);
    }

    return 0;
}

Не меняя то, что у вас слишком много, вы можете предотвратить печать дополнительного номера строки, зарегистрировав предыдущий символ. Подождите, чтобы напечатать номер строки, пока последний символ не был \n, и вы оказались на новой строке. Таким образом, EOF сработает до того, как будет напечатан посторонний номер строки.

#include <stdio.h>

int main(void) {
    int c, nl, p;

    nl = 1;
    FILE *file;
    file = fopen("testWords.in", "r");

    if (file) {
        printf("%d. ", nl);
        while((c = getc(file)) != EOF) {
            if (p == '\n') {
                ++nl;
                printf("%d", nl);
            }
            p = c;
            printf("%c", c);
        }
        fclose(file);
    }
    return 0;
}
1 голос
/ 29 января 2020

как заставить его вставлять в следующую строку, а не сразу при встрече с новой строкой.

Просто отслеживать, когда прочитанный символ является первым в строке.

Это хорошо обрабатывает файл без строк и файл, где последняя строка не заканчивается '\n'.

    int nl = 0; 
    int start_of_line = 1;
    while((c = getc(file)) != EOF) {
      if (start_of_line) {
        printf("%d ", nl++);
      }
      printf("%c", c);
      start_of_line = (c == '\n');
    }
...