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로 형식을 지정하여 각 변수로 가져온다. 끝.
도움이 되셨다면 아래 공감 버튼❤ 꾸욱 부탁드립니다. 감사합니다. 😉
'c언어 > c++' 카테고리의 다른 글
[c++] vector 정렬시(class, struct) 직접 만든 함수로 비교하기 (sort) (0) | 2020.03.25 |
---|---|
[c++] 메모리활용, vector 동적배열 사용하기 등 (0) | 2019.07.04 |
[c++] 동적으로 배열 할당하여 사용하기 (new, 포인터) (0) | 2019.07.03 |
[STL] Template, 시퀀스 사용 등 (0) | 2019.07.02 |
[c++/cpp] 연산자 오버로딩, 복사생성자, 템플릿(T) 등 (0) | 2019.07.01 |