본문으로 바로가기
반응형

오늘 포스팅할 내용은 MFC에서 CStdioFile 클래스를 이용해 유니코드 텍스트 저장, 불러오기입니다. 

유니코드 텍스트가 어떤 인코딩 방식으로 저장되었는지 나타내기 위해 데이터 맨 앞에는 BOM(Byte Order Mark)라는 것을 사용합니다.

 

유니코드 BOM

빅엔디안 : 0xFEFF
리틀엔디안 : 0xFFFE

 

WORD UnicodeMark = 0xFEFF;

// 유니코드임을 알려주자
m_File.Write(&UnicodeMark, sizeof(UnicodeMark));

// 데이터 쓰기
m_File.Write(str, str.GetLength() * sizeof(TCHAR));
m_File.Close();

예제를 들자면 이런 느낌으로?

 

한국에서 사용하면 기본은 한국 로컬이니 로컬은 패스...

로컬이 한국이 아니라 이상하게 나온다면 로컬을 설정해야 한다.

 

#include <locale.h> 

setlocale(LC_ALL, "Korean");

헤더를 추가하고 로컬을 Korean으로 하면 된다.

 

이제 불러오기만 구현을 하면 된다. 한글과 숫자 조합으로 저장을 했는데 잘 저장이 되었는데, 불러오기를 하니 이상한 괴상한 문자가 올라왔다.

 

확인을 해보니 CStdioFile에는 유니코드 문자열 읽는 기능이 없다고 한다. 즉, 유니코드를 읽기 위해서는 CStdioFile로 읽으려면 CStdioFileEx 이런 걸 가져다 써야 된다. 하지만 귀찮으니 CFILE 클래스를 써야겠다.

 

 

 

프로젝트 생성 및 구성

새 프로젝트를 생성한다.

 

 

 

MFC 앱 선택.

 

 

 

파일 이름 입력.

 

 

 

애플리케이션 종류는 대화 상자 기반으로 설정 후 마침 클릭.

 

 

 

리소스 뷰 탭에서 다이얼로그 클릭.

Ctrl + All + Delete로 모든 항목을 위에와 같이 삭제.

 

 

 

위에와 같이 Edit Box 2개와 Button 2개로 구성을 하였다.

저장 데이터를 입력하기 위한 Edit Box, 불러온 데이터를 입력하기 위한 Edit Box 그리고 저장 버튼과 불러오기 버튼.

 

 

 

Ctrl + Shift + x를 눌러 클래스 마법사를 열어 저장 버튼과 열기 버튼의 처리기를 추가한다.

 

 

 

멤버 변수 탭에서 Edit Box의 변수를 추가한다.

 

 

 

알기 쉽게 저장 데이터를 입력하는 Edit Box는 m_strSave, 불러온 데이터를 입력하는 Edit Box는 m_strLoad로 변수를 설정한다.

 

 

 

변수가 추가되었다면 확인 클릭하여 창을 닫는다.

 

 

 

제대로 입력이 되었다면 Application 헤더에 위에와 같이 2개의 버튼과 2개의 Edit 변수가 추가가 된다.

 

 

 

CStdioFile 클래스 저장, 불러오기 예제 코드

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
31
32
33
34
35
36
37
38
39
40
41
42
43
void CMFCApplication1Dlg::OnClickedButtonLoad()
{
    CString m_strPath, str;
   FILE* m_pFile;
    TCHAR BASED_CODE szFilter[] = _T("텍스트 파일(*.TXT) | *.TXT;*.txt; | 모든파일(*.*) |*.*|");
    CFileDialog dlg(FALSE, _T("*.txt"), 0, OFN_HIDEREADONLY, szFilter);
 
 
    if (dlg.DoModal() == IDOK) {
        m_strPath = dlg.GetPathName();
        
        errno_t err = _tfopen_s(&m_pFile, m_strPath, _T("rt,ccs=UNICODE"));
        if (err != 0) { return; }
        CStdioFile m_File(m_pFile);
 
        m_File.ReadString(str);
        m_strLoad.SetWindowText(str);
        m_File.Close();
    }
 
 
}
 
void CMFCApplication1Dlg::OnClickedButtonSave()
{
    CString m_strPath, str;
    FILE* m_pFile;
    TCHAR BASED_CODE szFilter[] = _T("텍스트 파일(*.TXT) | *.TXT;*.txt; | 모든파일(*.*) |*.*|");
    CFileDialog dlg(FALSE, _T("*.txt"), 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
    
    if (dlg.DoModal() == IDOK) {
        m_strPath = dlg.GetPathName();
 
        errno_t err = _tfopen_s(&m_pFile, m_strPath, _T("wt,ccs=UNICODE"));
        if (err != 0) { return; }
        CStdioFile m_File(m_pFile);
 
        // 텍스트 박스에서 글자를 가져오자
        GetDlgItemText(IDC_EDIT_SAVE, str);
        m_File.WriteString(str);
        m_File.Close();
    }
}
cs

코드는 정말 간단하다. 검증을 해보자.

 

 

한글, 영어, 숫자를 입력해주었다. 입력 후 저장 버튼을 클릭.

 

 

이름은 그냥 대출 넣고 텍스트를 저장.

 

 

 

제대로 저장이 되었다. 이제 불러오기로 잘 읽어오나 확인을 해보자.

 

 

 

불러오기를 클릭하여 아까 저장한 파일을 불러오니 제대로 값이 들어온다. 잘 되는 듯하다.

C#으로 구현하기 힘든 USB 쪽 건드릴 때 가끔씩 MFC를 쓰는데 뭘 만들려면 손이 많이 가서 귀찮다. 

 

 

 

 

2021.01.27 - [프로그래밍/C] - 예제로 알아보는 재귀 함수

 

예제로 알아보는 재귀 함수

오늘은 재귀 함수에 대해서 알아보려고 합니다. 재귀는 사전적 의미로 원래 자리로 되돌아온다는 뜻을 갖고 있습니다. 재귀 함수는 함수 안에서 자신을 호출하는 함수를 뜻합니다. 예제 1 1 2 3 4

hubbleconstant.tistory.com

2020.12.03 - [MCU/STM32F429] - 적외선 수신기 기능 구현

 

적외선 수신기 기능 구현

적외선 수신기는 IR리시버(수신기)라고도 하는데 여기서 IR은 Infrared의 약자로 적외선을 뜻합니다. 적외선 특성을 이용하기 때문에 사람이 볼 수 있는 가시광선 외 영역이라 눈으로 볼 수 없습니

hubbleconstant.tistory.com

2020.08.17 - [프로그래밍/C#] - C# 시리얼 통신 아스키 외 값 읽기

 

C# 시리얼 통신 아스키 외 값 읽기

오늘 포스팅할 내용은 시리얼 통신에 관한 내용입니다. C#을 이용한 시리얼 통신 방법은 아래의 포스팅을 참조 해주세요. 2019/04/15 - [프로그래밍/C#] - C#을 이용한 시리얼 통신(포트 검색/연결/해

hubbleconstant.tistory.com

 

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

[MFC]Edit 컨트롤 색상 변경  (0) 2020.07.03