Почему я не могу прочитать текстовый файл в 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
}