easy software

C언어 txt파일에 저장된 단어들의 첫번째 글자를 구분해보자(fscanf 사용) 본문

C언어/FILE IO

C언어 txt파일에 저장된 단어들의 첫번째 글자를 구분해보자(fscanf 사용)

JAVA 웹개발자 2015. 2. 28. 16:10

오랜만에 글을 작성합니다. 곧 개강이기도 하고 여러가지 바쁜일들이 많아서 공부를 못했네요.

 

얼마전에 차에 블랙박스를 하나 달았는데 신세계입니다. 차를 주차해놓고도 발 뻗고 편히 자네요.

 

본론으로 돌아가서 오늘은 파일 입출력에 대한 예제를 하나 해보겠습니다.

 

 

 

문자열을 저장하고 있는 파일을 열어서 A(a)나 B(b)로 시작하는 단어들의 개수를 계산하여

 

출력해주는 프로그램입니다. 모든 단어는 스페이스바, TAB, Enter에 의해서 구분된다고 가정합니다.

 

 

실행의 예

 

C:\test>word test.txt

A(a) 시작 단어 수: 4

B(b) 시작 단어 수: 1

 

 

실행예를 보시면 main함수에 인자를 전달함을 알 수 있습니다.

 

저는 아래와 같이 작성해봤습니다.

 

 

#include <stdio.h>

 

//문자열을 입력받기 위해 main에 매개변수를 정해줌
int main(int argc, char** argv){
     int aCount = 0, bCount = 0;
     char arr[50]; //세상에서 가장 긴 단어는 45글자
     int state;

 

     //사용자가 입력을 잘못할 경우에 오류발생
     if (argc != 2){
          printf("[실행파일이름 텍스트파일이름]  형식으로 입력하세요.\n");
          return 1;
     }

 

     //사용자가 입력한 이름의 텍스트 파일을
     //rt모드로 스트림 생성
     FILE* fp = fopen(argv[1], "rt");


     /* fopen함수는 오류발생시 NULL을 리턴하므로
     파일 개방 중 오류발생시 프로그램을 종료 */
     if (fp == NULL){
          printf("스트림 생성시 오류발생\n");
          return 1;
     }

 

     /* 파일에 얼마의 데이터가 있는지 모른다고 가정
     무한루프를 돌면서 계속 단어를 뽑아냄
     파일의 끝에 도달하면 feof함수에 의해 반복문 탈출 */
     while (1){
          if (feof(fp) == 0){
               fscanf(fp, "%s", arr);

               if (arr[0] == 'A' || arr[0] == 'a')
                    aCount++;
               if (arr[0] == 'B' || arr[0] == 'b')
                    bCount++;
          }
          else
               break;
     }

 

     printf("A(a) 시작 단어 수 : %d \n", aCount);
     printf("B(b) 시작 단어 수 : %d \n", bCount);

 

     /* fclose함수는 종료시 오류가 발생하면
     0이 아닌 다른값을 리턴하므로 비정상 종료로 판단되면
     안내후 프로그램을 종료 */
     state = fclose(fp);
     if (state != 0){
          printf("스트림 제거시 오류발생\n");
          return 1;
     }

 

     return 0;
}

 

 

main함수에 인자를 전달할 수 있도록 정의하고, 글자를 입력받을 수 있는 배열을 선언합니다.

 

윤성우의 열혈 C프로그래밍을 보니까 세상에서 가장 긴 단어가 45글자라고 하네요.

 

처음 조건문에서 사용자가 실행파일의 이름과 텍스트파일의 이름 외에

 

다른 단어를 입력하면 어떻게 프로그램을 실행해야 하는지 안내해줍니다.

 

이후에 사용자가 입력한 텍스트파일과의 스트림을 생성해줍니다.

 

feof함수는 제가 이전에 블로그에서 소개해 드린적이 있습니다. 개념을 잘 모르신다면

 

검색해서 공부하시기 바랍니다.

 

feof와 fscanf를 이용하여 공백으로 구분된 문자열들을 꺼내옵니다.

 

scanf함수는 익히 사용해보셔서 잘 아실겁니다.

 

fscanf도 scanf와 마찬가지 개념입니다.

 

위에서 보시다시피 fp에서 %s형식으로 문자열을 꺼내서 arr에 저장하라는 소리입니다.

 

문자열을 꺼내면서 조건문을 통해 A(a)인지 B(b)인지 검사하고 있습니다.

 

이후에 파일의 끝에 도달하면 break를 통해 반복문을 탈출합니다.

 

문자열을 꺼내면서 조건문을 통해 비교할때, 아스키코드값을 사용하셔도 됩니다.

 

 

 

이번 글에서는 파일 입출력에 대한 문제를 풀어보면서 fscanf함수를 사용하는 방법도 공부했습니다.

 

 

아래의 실제 실행 결과를 보시면 제 글이 조금이나마 더 이해가 되실거 같습니다.

 

 

 

test.txt에 저장된 데이터

 

 

 

 

 

cmd를 통한 실행화면

 

Comments