Prosto

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

Programing/C Programing

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

Prosto 2016. 9. 20. 19:08

 

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

 

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

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

 

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

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

 

 

 

 

(저번 시간의 최종 결과 화면입니다.)

 

 

이번에 해볼 문제는

저렇게 입력을 받은 후 이어서 해줄 처리입니다.

 

그런데 우리가 저번 시간에 단어 처리에 기껏 예외 등록까지 해줬는데..

문장에는 괄호()도 없었고, 단어 연결-도 없었죠?

...... 깜박했습니다.

 

그래서 이번 시간에는 문장을 조금 수정한 것을 써보려 합니다.

 

----변경

ABC(A and B and C) 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 re-tailers.
 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(A and B and C) 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.

----임의로 ()와 -를 넣어봤습니다.

 

 

잠깐 다시 변경된 텍스트파일로 실행한 결과를 볼까요?

 

어떤가요? 정상적으로 결과가 잘 나오죠?

 

단어가 244 -> 243이 된 이유는 '-'를 두 곳에 추가했는데

retailers -> re-tailers (그대로 한 단어)

consumer behavior -> consumer-behavior (두 단어에서 한 단어)

이 부분이 바뀌었기 때문입니다. 괄호도 단어 수가 늘어나지 않고 잘됐죠?

 

 

그럼 이제 다시 돌아와 이번 문제를 확인해볼까요?

이번 문제는 각 단락 기준으로 단어가 많은 단락을 위쪽으로 보내는 정렬을 해보는 문제입니다.

 

 

추가적으로 작업을 어떻게 해줘야 하는지 생각해볼까요?

지금까지했던 문제는 텍스트 파일 전체를 두고 문자, 단어, 단락을 세어봤죠?

하지만 이제는 단락 별로 단어의 수를 각각 측정해줘야겠네요.

그리고 다시 정렬하기 위해서는 파일에 있던 문자들을 임시로 저장해둘 char배열도 필요할 테고요.

 

 

그 후에 측정했던 단락별 단어의 개수를 기준으로

순서대로 char배열에서

파일출력(fprintf)을 이용하여 txt파일에 새로 써주면 되겠죠?

 

 

그러면 먼저 단락별 단어의 개수를 측정해봅시다.

이번시간엔 더 쉬운 방법인 배열로 해보도록 하죠.(단락의 수에 따라 능동적인 대응은 못 하지만 편하죠.)

 

이렇게 각 단락의 단어 수에 맞게 출력되도록 만들어보세요!

(직접 해보시고 밑에 소스를 비교해보세요.)

 

 

 

제가 사용한 방법을 확인해볼까요?

 

int형 wordsInParagraph라는 이름의 배열 4칸을 할당 받아 0으로 초기화해줬습니다.

 

체크된 부분을 보면 아시겠나요?

기존의 wordCount를 통하여 카운트를 증가시키는 곳입니다.

거기서 새로운 wordsInParagraph[배열번호]에도 카운트를 같이 해주는거죠.

 

여기서 nowParagraphNum이 어디서 사용됐는지 아시겠나요?

(저번 시간에 만든 프로그램에서 단락의 수를 셀 때 사용했던 부분이죠.)

 

마지막으로 for문을 이용해 단락의 단어 수를 출력해줬습니다.

 

여기까지 잘 하셨다면

 

다음 과제인 파일출력(fprintf)으로

새로 정렬한 텍스트 파일을 만드는 과정도 잘 하실 수 있을 겁니다.

 

 

시도해보시고 아래 코드를 참고하세요.

 

 

 

먼저 볼 부분은 변수 선언부입니다.

우리가 새로 char 2차원 배열과 strCount라는 변수를 선언했습니다.

char 2차원 배열에는 [각 단락]의 [각 문자]들이 들어갈 것이고,

strCount는 현재 단락에서 문자의 수를 측정해갈 것입니다.

 

어떻게 처리된 건지 아시겠나요?

1번은 개행 처리로 단락의 수를 늘렸던 부분이죠?

이 부분에서 개행 시 추가 처리를 해줄 마지막 자리에 개행문자 그 다음에 널문자를 넣어줬습니다.

(실제로 불러보면 아마 개행+널(문자종료)로 처리가 되겠죠?)

 

2번이 문자를 주로 넣어주는 부분입니다.

(1번의 경우는 마지막 개행 처리만 하는 것이고요.)

strCount를 증가해가며 그 자리에 문자를 하나씩 추가해주고있죠?

 

그리고 feof로 파일 읽는 게 끝났다면 마지막에는 개행+널문자를 추가해줬습니다. (깔끔하게 보기 위해)

널문자는 꼭 넣어줘야하지만, 개행은 넣지 않아도 상관없습니다.

 

여기까지가 배열에 파일에 있던 문자들을 옮긴 겁니다.

 

 

이제 파일출력으로 새로운 파일에 정렬된 문자를 넣어볼까요?

파일포인터를 "wt" 모드로 우리가 파일을 새로 생성하고 파일출력을 할 수 있도록 했습니다.

 

여기서 2중 for문 부분을 보면 temp를 이용해서

가장 문자열이 긴 부분을 찾아 콘솔 화면에 출력해주고,

fprintf를 통하여 해당 파일에 출력해주고있습니다.

 

 

마지막으로 완성된 모습입니다.

기존의 testTx에서 -> newTx가 생성된 모습을 확인할 수 있습니다.

 

그리고 printf로 출력해줬기 때문에

콘솔 창에서도 제대로 결과를 확인할 수 있었고요.

 

(이번에는 저번 글에서 바꿔주면 되기에 소스코드는 별도로 첨부 안 했습니다..

저번 글 소스를 기준으로 조금만 추가하시면 같은 결과를 보실 수 있을 겁니다.)

 

어떤가요. 조금 어려운 문제일 수 있지만,

천천히 한 단계씩 해보면 할 수 있겠죠?

 

 

파일입출력과 문자열 문제 풀기는 이번 글인 2번으로 마치도록 하겠습니다.

 

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

Comments