Почему я не могу прочитать текстовый файл в C с помощью Visual Studio?

Я создал программу на C, которая читает один за другим символ и определяет, является ли это гласной, числовой, пунктуацией и т. Д.

Пользователь может выбрать ввод символов с клавиатуры или из текстового файла.

Первая часть работает нормально и делает все как положено, однако, когда я запускаю программу и выбираю "читать из файла", она просто печатает инструкцию в "else if" и полностью не читается в текстовом файле.

У меня есть текстовый файл, сохраненный в папке "Исходные файлы" в каталоге Visual Studio 2015, и мой код выглядит следующим образом (рассматриваемая проблемная область находится близко к основанию):

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

FILE *pInputFile;
FILE *pOutputFile;

int answer = 0;

int chr = 0;
int numLowerCaseVowels = 0;
int numUpperCaseVowels = 0;
int numPunctuationChars = 0;
int numNumericals = 0;

int *pCharPointer;
int previousValue = 0;

int main()
{
    // ##### KEYOBARD OR FILE INPUT #####
    printf("\nKEYBOARD OR FILE INPUT?\n");
    printf("Press 'k' for keyboard, 'f' for file.\n");
    answer = _getch();

    if (answer == 'k')
    {
        printf("You selected keyboard.\n\n");
        printf("Enter a character.\n");

        // ##### KEYBOARD INPUT #####
        while ((chr = _getch()) != '\r')
        {
            pCharPointer = &chr;

            printf("%c", chr);

            // Determine if input is lower/upper case vowel.
            switch (chr)
            {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
                printf(" Lowercase Vowel.");
                numLowerCaseVowels++;
                break;
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                printf(" Uppercase Vowel.");
                numUpperCaseVowels++;
                break;
            default:
                break;
            }

            //Determine if char is punctuation.
            if (_istpunct(chr)) 
            {
                printf(" Punctuation Character.");
                numPunctuationChars++;
            }

            //Determine if char is numeric.
            if (iswdigit(chr))
            {
                printf(" Numeric Character.");
                numNumericals++;
            }

            //Determine if char is duplicate character.
            if (previousValue == chr) 
            {
                printf(" Duplicate Character.");
                previousValue = *pCharPointer;
            }
            else 
            {
                previousValue = *pCharPointer;
            }

            printf("\n");
        }
    }

    // ##### PROBLEM AREA  #####
    else if (answer == 'f')
    {
        printf("You've chosen file.\n\n");

        fopen_s(&pInputFile, "Text.txt", "r");
        chr = getc(pInputFile);

        while ((chr = getc(pInputFile)) != EOF)
        {
            printf("%c", chr);
        }

        fclose(pInputFile);
    }
    else
    {
        printf("Invalid Input. Exiting...\n");
        exit(1);
    }



    // ##### ANALYSIS #####
    printf("\nNumber of lowercase vowels: %d\n", numLowerCaseVowels);
    printf("Number of uppercase vowels: %d\n", numUpperCaseVowels);
    printf("Number of punctuation characters: %d\n", numPunctuationChars);
    printf("Number of lowercase vowels: %d\n\n", numNumericals);

    return 0;
}

Извините за количество кода, я подумал, что будет лучше включить весь исходный код.

На самом деле он пока не выполняет никакого анализа символов из текстового файла, я просто пытаюсь добраться до стадии, где он действительно сначала прочитает файл. Любая помощь будет оценена.

1 ответ

Решение

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

Правильный способ сделать это:

errno_t err;

if ((err=fopen_s(&pInputFile, "Text.txt", "r"))==0)
{
       // file exists: don't read a char before the loop or
       // it will be lost

        while ((chr = getc(pInputFile)) != EOF)
        {
            printf("%c", chr);
        }

        fclose(pInputFile);
}
else
{
   fprintf(stderr,"Cannot open file, error %d\n",err);
   // handle the error further if needed
}
Другие вопросы по тегам