티스토리 뷰

 MFC프로그램을 다루던 중에 파일을 다루어야 하는 일이 생겼습니다. 🥶 이 글에서 다룰 파일은 단순히 txt 파일로 되어있고 복잡한 바이트 단위로 저장돼있는 파일이 아니라 단순한 문자열을 다루고 있는 파일입니다.

 예를 들면 위와 같은 파일입니다. 😮 추측을 한다면 첫 번째 줄의 3은 아래에 나올 데이터 개수인 것을 쉽게 알 수 있습니다. 그 아래 데이터를 보면 맨 앞에는 모두 0인 것을 보아하니 그냥 구분을 위해 0을 쓴 것 같습니다. 이후에는 연도 월 일 순으로 되어있고 뒤에도 어딘가에서 필요한 데이터라고 생각하면 되겠습니다.

 문제는 위처럼 되어있는 텍스트 파일을 읽어와서 우리가 필요한 정보를 빼내야 한다는 것입니다. 😨 그럼 지금부터 방법을 설명해드리도록 하겠습니다.

CStdioFile 이용해 보기

	CStdioFile file;
	BOOL bOpen = file.Open(strFilePath, CStdioFile::modeNoTruncate | CStdioFile::modeRead);
	if (!bOpen) {
		printf("file open fail.");
		return;
	}
	else {
		printf("file opened.");
	}

 위와 같이 CStdioFile 객체를 하나 선언해주고 open() 메서드를 사용해서 첫 번째 인자로 파일 경로+파일명이 담긴 문자열을 넘겨주고 두 번째 인자로 파일을 열게 될 모드를 설정합니다.

modeNoTruncate 옵션은 같은 이름이 있으면 해당 파일을 새로(크기 0으로) 만들지 않고 해당 파일을 열게 됩니다. 😎modeReads는 말 그대로 읽기 전용으로 사용하겠다는 뜻입니다. 여러 추가 옵션도 많으니 msdn을 참고하시기 바랍니다.

 파일이 정상적으로 열리면 true가 반환되어 bOpen으로 받아서 파일 처리를 해줄 수 있습니다.

형식을 지정해서 파일 내용 읽어오기, 불러오기

CStdioFile file;
BOOL bOpen = file.Open(strFilePath, CStdioFile::modeNoTruncate | CStdioFile::modeRead);
if (!bOpen)
{
    printf("file open fail.");
    return;
}
else
{
    printf("file opened.");
}

CString line;

file.ReadString(line);

int nDataNum;
sscanf_s(line, " %d", &nDataNum);

printf("\n%d in *.VS\n", nDataNum);

for (int i = 0; i < nDataNum; ++i)
{
    file.ReadString(line);
    printf("%s\n", line);

    int tmp, year, mon, date, index, private_num;
    float killdeath;

    sscanf_s(line, " %d %d %d %d %f %d %d", &tmp, &year, &mon, &date, &killdeath, &index, &private_num);
}

 먼저 첫 번째 줄에 있는 데이터 개수를 불러옵니다. 불러오기 위해서는 ReadString() 메서드를 사용합니다. 이때 CString을 인자로 주어 해당 변수에 담아오도록 했습니다.

 형식을 지정해서 담아올 때는 sscanf_s() 메서드를 사용하여 담아옵니다. 첫 번째 줄은 단순히 정수형이기 때문에 int를 사용해서 받아옵니다. 이때 첫 번째 줄의 시작이 공백으로 되어있으므로 형식도 마찬가지로 공백을 두고 시작했습니다.

 이후 받아온 데이터 개수(nDataNum) 만큼 반복문을 돌려서 나머지 형식을 읽어옵니다. 마찬가지로 sscanf_s()를 사용하며 코드를 보시면 쉽게 이해할 수 있습니다.

결과 ✔

 결과 확인을 printf() 등으로 해보시면 정상적으로 데이터가 뽑혀 나온 것을 확인할 수 있습니다. ⛔ 주의할 점은 가져올 형식에 따라서 형식 지정자를 알맞게 설정해야 올바르게 데이터를 불러올 수 있다는 것입니다.

 결론 : CStdiofile로 파일을 한줄씩 문자열로 불러옴 ➡ sscanf_s로 형식을 지정하여 각 변수로 가져온다. 끝.

 도움이 되셨다면 아래 공감 버튼❤ 꾸욱 부탁드립니다. 감사합니다. 😉

👉[MFC] cpp 기본적인 문법들 보충

👉[MFC] 실행순서, DOC과 View 업데이트, 분할창에 사각형정보 다르게

👉[MFC] - MFC (Microsoft Foundation Classes)

댓글
댓글쓰기 폼
네이버 이웃추가
«   2020/06   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
글 보관함