문제: 단어 검출 프로그램

텍스트 파일에서 등록된 단어 이외의 단어를 찾아 새로운 파일에 출력합니다. 모든 단어의 길이는 최대 20자, 등록 단어 수는 최대 10개로 제한하며 검출 대상 단어 수는 제한이 없습니다. 다음 실행결과는 b.txt에서 a.txt에 등록되지 않은 단어를 찾아 c.txt에 출력합니다.

problem_18


풀이과정

fgets로 a.txt 와 b.txt 각각의 스트림 파일 버퍼에 내용을 저장하는 동시에 b.txt의 첫 줄 내용을 bstr에 저장하고 a.txt의 첫 줄 내용을 astr에 저장한다. 만약 bstr과 astr의 내용이 같다면 count를 1 추가해 c.txt에 저장할 수 없도록 한다.

a.txt에 저장된 모든 내용을 읽었다면, a.txt가 저장된 스트림 파일 버퍼의 위치지시자를 시작 위치로 옮겨준다. 이때 fseek함수나 rewind함수를 사용하면 된다.

#include <stdio.h>
#include <string.h>

int main(void)
{
	FILE* afp, * bfp, * cfp;
	char astr[21];
	char bstr[21];
	char* ares;
	char* bres;
	int count;

	afp = fopen("a.txt", "r");
	if (afp == NULL)
	{
		printf("a.txt가 열리지 않았습니다.");
		return 1;
	}

	bfp = fopen("b.txt", "r");
	if (bfp == NULL) 
	{
		printf("b.txt가 열리지 않았습니다.");
		return 1;
	}

	cfp = fopen("c.txt", "w");
	if (cfp == NULL) 
	{
		printf("c.txt가 열리지 않았습니다.");
		return 1;
	}

	while (1)
	{
		count = 0;
		bres = fgets(bstr, sizeof(bstr), bfp);

		while (1)
		{
			ares = fgets(astr, sizeof(astr), afp);
			if (ares == NULL) break;
      // a.txt의 내용을 모두 읽었으면 while문 탈출
			if (strcmp(bstr, astr) == 0) 
			{
				count++;
				break;
			}
      // bstr과 astr이 같다면 count에 1을 더하고 while문 탈출
		}
		if (count == 0) fputs(bstr, cfp);
    // bstr과 astr이 한번도 같지 않았다면 c.txt에 bstr의 내용을 출력
		fseek(afp, 0, SEEK_SET);
    // rewind(afp)로 바꾸어도 된다.
		if (bres == NULL) break;
    // b.txt의 모든 내용을 읽었다면 while문 탈출
	}

	return 0;
}

Tags:

Updated: