Бесконечно l oop при передаче имени текстового файла более чем одной функции - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь передать имя текстового файла двум различным функциям, чтобы они могли работать с файлом отдельно. Первый l oop работает нормально и дает ожидаемый результат, но вторая функция застревает в бесконечном l oop. Вот основная функция:

#include <stdio.h>
#include <stdlib.h>
int countCharacters(const char *nameOfFile);
int countWords(const char *nameOfFile);
int main()
{
    int characterCount = 0;
    int wordCount = 0;

    char fileName[100];

    printf("Enter the name of the text file: ");
    scanf("%s",fileName);

    characterCount = countCharacters(fileName);
    wordCount = countWords(fileName);

    printf("Characters:%d  \n",characterCount );
    printf("Words:%d  \n",wordCount);

    return 0;
}

Это первая функция:

#include <stdio.h>
#include <stdlib.h>
int countCharacters(const char *nameOfFile)
{
        char currentCharacter;
        int numCharacter = 0;
        FILE *fpt;

        fpt = fopen(nameOfFile,"r");

        while( (currentCharacter = fgetc(fpt)) != EOF )
        {
            if(currentCharacter != ' ' && currentCharacter != '\n')
                numCharacter++;
        }
        fclose(nameOfFile);
        return numCharacter;
}

И это вторая функция:

#include <stdio.h>
#include <stdlib.h>
int countWords(const char *nameOfFile)
{
        char currentCharacter;
        int numWord = 0;
        FILE *fpt;

        fpt = fopen(nameOfFile,"r");

        while( (currentCharacter = fgetc(fpt)) != EOF )
        {
            if(currentCharacter == ' ' || currentCharacter == '\n')
                numWord++;
        }
        fclose(nameOfFile);
        return numWord;
}

Итак, мой вопрос как C обрабатывает имя файла, который был передан двум различным функциям, и что я должен делать, чтобы предотвратить возникновение таких бесконечных циклов, когда я хочу использовать имя текстового файла более чем в одном функция? Я удостоверился, что fpt указывал на начало текстового файла, когда он был открыт в обоих случаях, и я не вижу, в чем проблема с l oop, чтобы пройти через файл, так как оба имеют идентичные условия.

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Всегда должен закрывать файл с указателем ФАЙЛА.

FILE * fp = fopen (имя файла, w);

fclose (fp);

0 голосов
/ 15 марта 2020

Исправленный код для repl.it

Заменить fclose (nameOfFile) на fclose (fpt)

С cppreference.com ,

*FILE *fopen( const char *filename, const char *mode );*

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

Если вам потребуется выполнить сброс до начала файла, вы можете использовать перемотка (* поток FILE)

rewind(fpt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...