2016-10-15 3 views
0

나는 문자 하나 하나를 읽고 그 문자가 모음, 숫자, 구두점 등인지를 결정하는 C 프로그램을 만들었습니다.Visual Studio를 사용하여 C로 텍스트 파일을 읽을 수없는 이유는 무엇입니까?

사용자는 키보드 또는 텍스트 파일을 통해 문자를 입력하도록 선택할 수 있습니다 .

첫 번째 부분은 정상적으로 작동하고 예상대로 작동하지만 프로그램을 실행하고 '파일에서 읽기'를 선택하면 'else if'문을 인쇄하고 텍스트 파일.

내가 비주얼 스튜디오 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; 
} 

코드의 양은 유감 스럽지만 전체 소스 코드를 포함하는 것이 가장 좋을 것이라고 생각했습니다.

아직 실제로 텍스트 파일의 문자에 대한 분석을 수행하지는 않지만 실제로 파일을 실제로 읽는 단계까지 도달하려고합니다. 도움이 될 것입니다.

+0

체크 - 그렇다면, 그리고 하나. – usr2564301

+0

1.'fopen_s()'의 리턴 코드를 확인하십시오. *는 *가 0이거나 그렇지 않으면 에러가있었습니다. 2. 파일 이름과 파일 이름을 실행 파일과 동일한 디렉토리에서 확인하십시오. 재미를 위해서'fopen_s'을'fopen'으로 대체하십시오. 4. 실제로 루프 앞에서'chr = getc (pInputFile)'호출을 먼저 수행함으로써 첫 번째 cahracter를 건너 뜁니다. –

+0

@MaximilianGerhardt "실행 파일과 동일한 디렉토리에서 파일 이름과 파일을 확인하십시오.": 실행 파일 디렉토리에서 코드를 실행하는 경우입니다. 필수 사항은 아닙니다. –

답변

0

파일을 발견하더라도 문제는 입력 한 첫 번째 문자가 손실된다는 것입니다. 그 일의

올바른 방법 :`fopen_s`가 오류를 반환하는 경우

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 
} 
+0

정말 대단합니다. 고마워요. 나는 코드를 찾아서 errno 2를 돌려 주었다. 그래서 어떤 이유로 파일을 찾지 못했다. – ChrisToff23

+0

일반적인 오류 :'printf ("% s \ n", os.getcwd());'를 실행하면 결과에 놀랄 수 있습니다 :) –

+0

유용했습니다. 프로젝트가 기본적으로 완전히 다른 디렉토리에서 읽음을 알게되었습니다. – ChrisToff23

관련 문제