관리 메뉴

History

[C언어] 파일에 저장된 문자열 수정하기 본문

C,C++/개념 실습 프로그래밍

[C언어] 파일에 저장된 문자열 수정하기

luckybee 2023. 4. 26. 18:26
728x90
반응형

이번 차시 실습에서는 텍스트 파일에 저장된 특정 문자를 찾아서 원하는 단어로 바꾸는 실습을 진행한다.

 

파일에 기록된 내용을 변경하려면 파일 입출력에서의 옵션을 변경해야 한다. 

w+: 쓰기 우선 읽기모드
r+: 읽기 우선 쓰기모드
a+: 이어쓰기 우선 읽기 모드

1. 옵션

 

읽기와 쓰기 모두 작업하면서 원하는 위치에 데이터를 쓰더라도 다른 데이터에 영향을 미치지 않게 하려면 r+ 옵션을 사용해야한다. 만약 지금 사용하는 파일이 텍스트 파일이라는 것을 강조하고 싶으면 r+t라고 사용하면 된다.

 

2. 단어 찾기

 

원하는 단어를 찾기 위해서는 strstr 함수를 사용하여 특정 단어를 찾는다.

strstr 단어는 string.h 헤더파일에 있기 때문에 include를 해줘야한다. strstr 함수는 추후에 따로 정리하겠다.

 

현재까지 설명했던 내용을 코드로 적용해보면 아래와 같이 작성할 수 있다.

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
#define MAX_LENGTH		128

int main()
{
	char buf[MAX_LENGTH];  //문자열을 읽을 배열
	FILE* p_file = NULL; //파일 포인터 선언 및 초기화
	char* p_temp;
	int find_word;
	if (fopen_s(&p_file,"data.txt","r+t")==0){   //파일을 읽기 모드로 열겠다.
		while (fgets(buf,MAX_LENGTH,p_file)!=NULL){
			p_temp = strstr(buf, "삼성");
			if (p_temp!=NULL) { //특정 단어를 찾았으면
			
			}
		}
	}
	fclose(p_file); //파일을 닫겠다.


	return 0;
}

strstr함수는 단어의 시작 주소를 찾은 것이기 때문에 0의 시작 위치에서 한 줄에서 원하는 단어가 몇 번째 위치에 있는지 알고 싶으면 p_temp - buf 즉 찾은 주소에서 buf의 시작 주소를 빼면 buf배열에서 p_temp가 위치한 값을 알 수 있다. 

 

잠시 아래 그림을 보겠다.

원하는 단어 위치 찾기

현재 내가 strstr로 찾은 문자의 시작은 6번지에 있고 한 줄의 시작 주소는 0번지에 있기 때문에 한 줄에서의 원하는 단어의 시작 주소를 찾으려면 6번지 -0번지 이렇게 되기 때문에 한 줄에서 6번째 위치에 내가 찾으려고 하는 단어가 있다는 것을 알 수 있다.

 

이제 메모장에서 원하는 단어로 변경하기 위해서는 위에서 찾은 위치 값을 파일에 위치한 값으로 변환해서 fseek 함수로 파일 포인터를 옮겨야 한다.

파일에서 fgets 함수를 사용하여 한 줄을 읽었다면 이미 파일 포인터는 해당 줄의 끝으로 이동했기 때문에 다시 되돌려야 한다.  

 

find_word = strlen(buf) - (p_temp -buf) + 1;

그리고 fseek함수를 이용해서 파일 포인터를 다시 앞으로 되돌린다. 코드는 아래와 같다.

fseek(p_file, -1 * find_word, SEEK_CUR);

fseek 함수에서 양수를 사용하면 파일의 앞쪽에서 뒤쪽으로 파일포인터가 이동하고 음수를 사용하면 뒤쪽에서 앞쪽으로 파일포인터가 이동한다.

 

3. 내용 수정하기

 

찾을 내용을 수정할 때는 fwrite함수를 이용해서 원하는 단어를 바꿔준다. 코드는 아래와 같다.

fwrite("이노", 4, 1, p_file);

 

이노라는 단어를 4바이트 크기로 1번만 p_file에 적을 것이라고 해석하면 된다.

 

그리고 fseek함수로 파일 포인터를 앞으로 되돌렸기 때문에 다시 원래대로 파일 포인터를 한 줄의 끝으로 보내야한다. 그렇기 때문에 현재 fwrite함수를 사용해서 4바이트 크기만큼 뒤로 보냈기 때문에 find_word - 4 만큼 이동해야한다.

 

fseek(p_file, find_word-4, SEEK_CUR);

아래는 완성 코드이다.

#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
#define MAX_LENGTH		128

int main()
{
	char buf[MAX_LENGTH];  //문자열을 읽을 배열
	FILE* p_file = NULL; //파일 포인터 선언 및 초기화
	char* p_temp;
	int find_word;
	if (fopen_s(&p_file,"data.txt","r+t")==0){   //파일을 읽기 모드로 열겠다.
		while (fgets(buf,MAX_LENGTH,p_file)!=NULL){
			p_temp = strstr(buf, "이노");
			if (p_temp!=NULL) { //특정 단어를 찾았으면

				find_word = strlen(buf) - (p_temp - buf) + 1;
				fseek(p_file, -1 * find_word, SEEK_CUR);
				fwrite("민기", 4, 1, p_file);
				fseek(p_file, find_word-4, SEEK_CUR);
			}
		}
	}
	fclose(p_file); //파일을 닫겠다.

	return 0;
}
728x90
반응형
Comments