공부중

[C/C++]유니코드로 콘솔출력 또는 파일출력이 동작하지 않는 경우.. 본문

Programing/C, C++

[C/C++]유니코드로 콘솔출력 또는 파일출력이 동작하지 않는 경우..

곤란 2021. 5. 2. 12:53
반응형

요 며칠전 프로그램을 짜다가 한글 출력이 안되는걸 보고 왜 안되지?? 고민을하고 삽질을 하다가

결국 해결을하고나서 여기에 글을 남겨봅니다.

 

결론은 locale 설정을 해주어야 하는데

locale 관련 MSDN만 보고 싶다면 아래 링크를 참조하면 될것같다.

docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-160

 

setlocale, _wsetlocale

CRT (Microsoft C 런타임) 라이브러리 함수 및에 대해 설명 합니다 setlocale _wsetlocale .

docs.microsoft.com

docs.microsoft.com/ko-kr/cpp/standard-library/locale-class?view=msvc-160

 

locale 클래스

자세한 정보: locale 클래스

docs.microsoft.com

 

 

일단 테스트용 코드는 아래와 같다.

#include <iostream>
#include <tchar.h>

#if defined(UNICODE) || defined(_UNICODE)
#define _tcout std::wcout
#else
#define _tcout std::cout
#endif

int main()
{
	_tcout << _T("프로그램 시작!") << std::endl;

	const TCHAR* Foo = _T("안녕하세요, %d, %s, %f\n");
	const TCHAR* Foo1 = _T("%d, %s, %f\n");

	FILE* fp = nullptr;

	errno_t err = _tfopen_s(&fp, _T("test.txt"), _T("wt"));

	if (0 == err)
	{
		int result = _ftprintf_s(fp, Foo, 10, _T("Hello"), 3.14f);
		int result1 = _ftprintf_s(fp, Foo1, 10, _T("Hello"), 3.14f);

		if (EOF == result)
		{
			_tcout << _T("파일 쓰기 실패1") << std::endl;
		}

		if (EOF == result1)
		{
			_tcout << _T("파일 쓰기 실패2") << std::endl;
		}

		fclose(fp);
	}
	else
	{
		_tcout << _T("파일 열기 실패") << std::endl;
	}

	return 0;
}

프로그램 실행결과는 아래와 같다.

일단 콘솔창에 아무것도 안나오고...

 

파일 출력에 한글포함 문자는 실행조차 되질 않았다..

문제 상황은 위와같이 한글은 전혀 출력이 되지않는 문제를 보이고 있고

위의 스크린 샷처럼 혹시나 몰라서 걸어놓은 예외 if문이 안걸린것도 아니었다.

걸렸지만 한글이기 때문에 출력이 안되고 있었던것....

문제를 해결하는 코드는 아래와 같았다.

#include <iostream>
#include <tchar.h>
#include <locale>

#if defined(UNICODE) || defined(_UNICODE)
#define _tcout std::wcout
#else
#define _tcout std::cout
#endif

int main()
{
	//setlocale(LC_ALL, "korean");		// C 방식
	std::locale::global(std::locale("Korean"));

	_tcout << _T("프로그램 시작!") << std::endl;

	const TCHAR* Foo = _T("안녕하세요, %d, %s, %f\n");
	const TCHAR* Foo1 = _T("%d, %s, %f\n");

	FILE* fp = nullptr;

	errno_t err = _tfopen_s(&fp, _T("test.txt"), _T("wt"));

	if (0 == err)
	{
		int result = _ftprintf_s(fp, Foo, 10, _T("Hello"), 3.14f);
		int result1 = _ftprintf_s(fp, Foo1, 10, _T("Hello"), 3.14f);

		if (EOF == result)
		{
			_tcout << _T("파일 쓰기 실패1") << std::endl;
		}

		if (EOF == result1)
		{
			_tcout << _T("파일 쓰기 실패2") << std::endl;
		}

		fclose(fp);
	}
	else
	{
		_tcout << _T("파일 열기 실패") << std::endl;
	}

	return 0;
}

실행 결과는 아래와 같다.

이제 한글 출력이 된다..
이제 파일에도 한글 출력이 잘된다.

 

출력함수들이 이런 문제가 발생했을때 EOF말고 다른 리턴을 해줬으면 더 금방 찾지않았을까? 하는 생각이 들어버렸다.

 

 

반응형