Prosto

파일입출력과 문자열 문제 풀기 -C언어 본문

Programing/C Programing

파일입출력과 문자열 문제 풀기 -C언어

Prosto 2016. 9. 20. 12:48

 

이번에는 C언어 파일입출력과 문자열에 관련된 난이도 있는 문제를 풀어보도록하겠습니다.

 

파일입출력에 대하여 잘 모르시겠다면..

 먼저 이 글들을 확인해보세요.

 

파일 입출력(FILE*) 이해, 예제 -1 -C언어

파일 입출력(FILE*) 이해, 예제 -2 -C언어

 

 

 먼저, 문제는 이렇습니다.

 

일정 내용을 txt파일에 저장시켜놓고, 프로그램에서 그 파일을 불러들여 전체 글의

문자의 개수, 단어의 개수, 단락의 개수를 세는 프로그램을 만들어보도록 하겠습니다.

 

 

일단 크게 생각해보면 이런 것들이 처리에 필요하겠네요.

 

1. txt 파일이 미리 생성되어 있어야 한다.

 

2. 파일 입출력을 다룰 수 있어야 한다. (fopen, fscanf, fclose)

 

3. 문자열에 대한 처리는 문자 하나하나 받는 것으로 충분하다. (각 문자 검사 필요)

 

 

하지만.. 여기에 추가적으로 생각할 부분은

 문자, 단어, 단락의 기준은 어떻게 지을 것인가에 대한 부분입니다.

확실하게 집고 넘어가지 않으면 애매하니 정하겠습니다.

 * 문자의 수를 측정할 때는 알파벳만 허용한다.

 * 단어의 수를 측정할 때는 약자의 경우 하나로 취급한다.

       FTP(File Transfor Protocol)의 경우 단어 하나임.

       연결 단어(-)도 마찬가지로 하나.

 * 단락의 수엔터로 구분짓는다.(\n)

 

 

그럼 순서대로 해볼까요?

 

일단 txt파일입니다. 상대경로를 사용하여..

(엔터 하나로 단락이 나눠진 게 보이죠?)

 

 

여러분도 프로젝트 파일 안에 아래의 텍스트 내용을 복붙하여 만들어주세요. (저는 testTx.txt 파일로 만들었습니다.)

 

 ABC Airlines uses the same scent everywhere, for instance, in the perfume worn by its flight attendants, in its hot towels, and in other elements of its service. Among the sensory elements, using a scent is a relatively recent marketing strategy adopted by many retailers.

 More and more research shows that smell affects consumer behavior, which stimulates the demand for scent marketing by stores, hotels, and even museums. Advertising studies in Martin Lindstrom's book Brand Sense suggest that although most contemporary commercial messages are aimed at our eyes, many of the emotional moments people remember on a given day are actually prompted by smell.

 Advertising studies in Martin Lindstrom's book Brand Sense suggest that although most contemporary commercial messages are aimed at our eyes, many of the emotional moments people remember on a given day are actually prompted by smell.

 ABC Airlines uses the same scent everywhere, for instance, in the perfume worn by its flight attendants, in its hot towels, and in other elements of its service. Among the sensory elements, using a scent is a relatively recent marketing strategy adopted by many retailers. More and more research shows that smell affects consumer behavior, which stimulates the demand for scent marketing by stores, hotels, and even museums. Advertising studies in Martin Lindstrom's book Brand Sense suggest that although most contemporary commercial messages are aimed at our eyes, many of the emotional moments people remember on a given day are actually prompted by smell.

 

- testTx.txt -

(하나의 문장을 가지고 부분 부분 복사/붙여넣기하여 네 단락으로 나눴습니다. (가장 밑에 단락이 원래 글입니다.))

 

 

 

일단은 파일을 열어야겠죠?

   FILE *fps;  //파일포인터 -> fscanf에 사용되는 intput용

 

   fps = fopen("testTx.txt", "rt");    //해당 이름의 파일오픈.
   if (fps == NULL) {   //예외처리.
      printf("실패 - 종료\n");
      return 1;
   }

   fclose(fps);

파일을 열고 닫는 방법입니다. (파일입출력 관련 글 링크)

 

 

그리고 여기서 이제 파일에서 프로그램으로 입력을 받을 때 어떻게 받을 것인지 중요하겠죠?

 

음.. 저는 파일이 끝날 때까지, 문자 한 글자씩 가져와서 비교해보며 하고싶네요.

(처음부터 문자열 배열에 전부 넣어주고 그 후에 처리하는 방법도 있겠죠?)

   char cha;

 

   while (feof(fps) == 0) {    //feof == 내용 있다면 0 반환.
       fscanf(fps, "%c", &cha);
       printf("%c", cha);

   }

 ( feof(파일포인터)가 파일 내용이 남아있는지 확인하는 부분이였죠? )

 

이런 내용은 fopen과 fclose 사이에서 처리해준다면 어떤 결과가 나올까요?

한번 확인해보도록 하죠.

(소스와 실행결과)

 

일단 cha 변수에 글자 하나씩 받아서 printf로 화면에 출력해줬죠?

(검사할 때 쓰기위해서 cha변수에 하나씩 받았습니다.)

개행(\n)도 잘 들어가서 출력되는 것을 확인할 수 있었을 겁니다.

 

 

이제 글자를 하나씩 검사하는 부분을 만들어보세요.

 

if문을 이용하여 어떠한 경우는 문자로 카운트해주고,

또, 어떠한 경우엔 단어로 구분지어 카운트해주고, 개행이 되는 경우는 단락으로 구분해주면 되겠죠?

 

고민하고 직접 해보시길 바랍니다.

 

(출력 결과 예)

 

 

추가적인 힌트라면...

  (문자, 단어, 단락 모두) 카운트 변수로 하나씩 카운트해줘야 할 것이고요.

  또 단어는 조건이 까다로우니 따로 검사를 더 해줘야겠죠?

 

 

 

아래에 완성 코드가 있으니 해보신 후 확인해보세요.

 

 

 

그럼 완성된 코드입니다.

 

 

*전체 소스

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

 

int main(void) {
    FILE *fps;  //파일포인터 -> fscanf에 사용되는 intput용.
 
    int nowParagraphNum = 0;
 
    char cha;
    int wordCount = 0;  //단어 수.
    int charCount = 0;  //문자 수.

    
int nowStateInWord = 0;  //단어 안이면 1.

    fps = fopen("testTx.txt", "rt");  //파일오픈.
    if (fps == NULL) {  //예외처리.
        printf("실패 - 종료\n");
        return 1;
    }

 

    printf("일단 파일의 내용을 출력합니다..\n");
    while (feof(fps) == 0) {  //feof == 내용 있다면 0 반환.
        fscanf(fps, "%c", &cha);
        printf("%c", cha);

        if (cha >= 'A' && cha <= 'z') { //문자가 알파벳이면.
            charCount++;

            if (nowStateInWord == 0) {
                nowStateInWord = 1;
            }
        }
        else {
            if (nowStateInWord == 1) {
                if (cha == '(') {
                    nowStateInWord = 2;
                }
                else if (cha == ' ' || cha == ',' || cha == '.') {
                    nowStateInWord = 0;
                    wordCount++;
                }
            }
            else if (nowStateInWord == 2) {
                if (cha == ')') {
                    wordCount++;
                    nowStateInWord = 0;
                }
            }
        }
        if (cha == '\n') {
            nowParagraphNum++;
        }

    }
    fclose(fps);


    nowParagraphNum++;
 
    printf("\n\ncharacter Num : %d,  word Num : %d,  paragraph Num : %d \n\n", charCount, wordCount, nowParagraphNum);

 

    return 0;
}

(글상자 오류가 많네요... 따로 플러그인을 써야하려나..)

 

 

소스에서 nowStateInWord를 이용해서 단어 검사를 한 걸 확인할 수 있을 겁니다.

만드는 방법은 여러가지가 있으니

이런 방법도 있고, 다른 방법도 있을 것입니다.

다른 방법으로도 결과가 잘 나왔다면 제 코드는 그냥 보고 참고해보세요.

이런식으로도 할 수 있구나..하고요.

 

 

이번에 파일입출력을 통하여 만들어진 파일을 불러와

해당 파일의 텍스트 문자를 가지고 문자 수, 단어 수, 단락 수를 세어보는 작업을 했습니다.

 

 

파일입출력과 if문(문자 검사) 공부에 도움이 됐나요?

 

 

질문은 댓글이나 메일로 따로 연락주시면 시간되는 때 답변드리겠습니다. ( 연락 )

Comments