C-код для подсчета количества символов, слов и строк в файле - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок в C, поэтому я хотел увидеть код, который состоит из подсчета количества символов, слов и строк в данном файле.Я нашел код ниже, НО проблема, которую я не понял, почему мы должны увеличивать слова и строки для последнего слова после цикла while: if (characters > 0)...

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file;
    char path[100];
    char ch;
    int characters, words, lines;

    /* Input path of files to merge to third file */
    printf("Enter source file path: ");
    scanf("%s", path);

    /* Open source files in 'r' mode */
    file = fopen(path, "r");

    /* Check if file opened successfully */
    if (file == NULL) {
        printf("\nUnable to open file.\n");
        printf("Please check if file exists and you have read privilege.\n");
        exit(EXIT_FAILURE);
    }

    /*
     * Logic to count characters, words and lines.
     */
    characters = words = lines = 0;
    while ((ch = fgetc(file)) != EOF) {
        characters++;

        /* Check new line */
        if (ch == '\n' || ch == '\0')
            lines++;

        /* Check words */
        if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0')
            words++;
    }

    /* Increment words and lines for last word */
    if (characters > 0) {
        words++;
        lines++;
    }

    /* Print file statistics */
    printf("\n");
    printf("Total characters = %d\n", characters);
    printf("Total words      = %d\n", words);
    printf("Total lines      = %d\n", lines);

    /* Close files to release resources */
    fclose(file);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Выходные данные должны быть скорректированы в зависимости от того, что введенный файл заканчивается хорошими символами новой строки ('\ n') или нет.

Для простого текстового файла с окончанием '\ n' наво всех строках (включая последнюю) удалите эти приращения после циклов.

Но, похоже, программу нужно немного отладить для этих угловых случаев, и это зависит от вашего определения.Но я бы настоятельно рекомендовал использовать команду Linux / Unix wc в качестве справочного материала и средства разрешения конфликтов.

0 голосов
/ 23 февраля 2019

Эта программа имеет некоторые проблемы:

  • ch должно быть определено как int, чтобы обеспечить правильное обнаружение EOF.

  • слишком длинный ввод для scanf("%s", path); переполнит path и вызовет неопределенное поведение.Кроме того, проверьте возвращаемое значение для обнаружения неправильного ввода или преждевременный конец файла:

    1015 *
  • if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0') также не является стандартным методом обнаружения границ слов.if (isspace(ch)) более идиоматичен.

  • неверное количество слов: несколько пробелов будут считаться несколькими словами!Вместо этого вы должны определить границы, то есть пробелы, за которыми следуют непробельные символы.

  • последний тест - неудачная попытка решения вышеуказанной проблемы, его недостаточно.Дополнительный тест действительно необходим для подсчета последнего последнего потока, если поток не заканчивается новой строкой.

Вот исправленная версия:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file;
    char path[1024];
    int ch, last;
    long long int characters, words, lines;

    /* Input path of files to merge to third file */
    printf("Enter source file path: ");
    if (scanf("%255s", path) != 1) {
        printf("Invalid input\n");
        return EXIT_FAILURE;
    }

    /* Open source files in 'r' mode */
    file = fopen(path, "r");

    /* Check if file opened successfully */
    if (file == NULL) {
        printf("Unable to open file %s\n", path);
        printf("Please check if file exists and you have read privilege.\n");
        return EXIT_FAILURE;
    }

    /*
     * Logic to count characters, words and lines.
     */
    characters = words = lines = 0;
    last = '\n';
    while ((ch = fgetc(file)) != EOF) {
        characters++;

        /* Check new line */
        if (ch == '\n')
            lines++;

        /* Check words */
        if (!isspace(ch) && isspace(last))
            words++;

        last = ch;
    }

    /* Increment words and lines for last word */
    if (last != '\n') {
        lines++;
    }

    /* Print file statistics */
    printf("\n");
    printf("Total characters = %lld\n", characters);
    printf("Total words      = %lld\n", words);
    printf("Total lines      = %lld\n", lines);

    /* Close file to release resources */
    fclose(file);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...