#include <stdio.h>
#include <ctype.h> // tolower
#include <string.h> // strcmp, strcpy
typedef struct {
char word[30];
int time;
} words;
int main()
{
FILE* fp = NULL;
char file_nm[200];
char buf[30]; // 30-1글자 까지
int i, j, qty, tmp;
char ch; // 파일에서 1글자를 읽어 저장
int max[5] = {0, }; // 최상위 빈도 5개
words ws[3000] = {"", 0, }; // 3000단어
printf("파일명 : ");
gets(file_nm);
strcat(file_nm, ".txt"); // buf에 .txt를 이어 붙임
fopen_s(&fp, file_nm, "r");
if (fp == NULL) {
printf("파일 열기 실패 - %s\n", buf);
system("pause");
return 1;
}
while (1) {
for (i = 0; i < 30; i++) {
ch = tolower(fgetc(fp)); // 글자를 읽어 소문자로 만든다
if (ch == EOF) break; // 파일의 끝이면
if (isalpha(ch)) buf[i] = ch; // 알파벳 문자면 buf에 저장
else break; // 아니면 단어구분
}
if (ch == EOF) break;
if (i > 1) { // 2글자 이상일 경우만
buf[i] = '\0'; // 문자들 끝에 널문자를 넣어 문자열 완성
for (i = 0; i < qty; i++) { // 현재 등록된 단어수만큼
if (strcmp(buf, ws[i].word) == 0) { // 등록된 단어를 만나면
ws[i].time++; // 회수 증가
break; // 그 뒤의 단어들은 검사하지 않음
}
}
if (i == qty) { // 처음 등장한 단어
strcpy(ws[i].word, buf); // 단어 등록
ws[i].time++; // 회수를 1로 만듬
qty++; // 등록된 단어수 갱신
}
}
}
//for (i = 0; i < qty; i++) printf("%d : %s : %d\n", i+1, ws[i].word, ws[i].time); // for test
for (i = 0; i < qty; i++) { // 등록된 단어들
if (ws[i].time > ws[max[4]].time) {
max[4] = i;
for (j = 4; j > 0; j--) {
if (ws[max[j-1]].time < ws[max[j]].time) {
tmp = max[j-1];
max[j-1] = max[j];
max[j] = tmp;
}
else break;
}
}
}
/*
for (i = 0; i < qty; i++) { // 등록된 단어들
if (ws[i].time > ws[max[4]].time) { // 5위
max[4] = i;
if (ws[max[3]].time < ws[max[4]].time) { // 4위
tmp = max[3];
max[3] = max[4];
max[4] = tmp;
if (ws[max[2]].time < ws[max[3]].time) { // 3위
tmp = max[2];
max[2] = max[3];
max[3] = tmp;
if (ws[max[1]].time < ws[max[2]].time) { // 2위
tmp= max[1];
max[1] = max[2];
max[2] = tmp;
if (ws[max[0]].time < ws[max[1]].time) { // 1위
tmp= max[0];
max[0] = max[1];
max[1] = tmp;
}
}
}
}
}
*/
for (i = 0; i < 5; i++) printf("%d : %s : %d\n", i+1, ws[max[i]].word, ws[max[i]].time);
fclose(fp);
return 0;
}