※요약

유니코드 타입의 한글 문자열을 출력하려고 하면 깨지거나 ??? 등, 제대로 나오지 않는 문제점들이 있다.



원인

네이버 지식인 참고



※해결방법

locale.h                                            //헤더를 추가


_wsetlocale( LC_ALL, L"korean" );      //지역화 설정을 전역적으로 적용

wcout.imbue( locale("korean") );        //출력시 부분적 적용

wcin.imbue( locale("korean") );          //입력시 부분적 적용


만일 한 프로그램에 여러 언어를 출력해야 한다면 그때그때 설정을 바꿔준다.



※예제

#include <stdio.h>
#include <locale.h>

int main( )
{
	_wsetlocale( LC_ALL, L"korean" );

	FILE *pFile = NULL;

	pFile = _wfopen( L"d:\\Text.txt", L"w"  );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		for( int i=0 ; i<3 ; ++i )
		{
			fwprintf( pFile, L"%d %f %s \n", i, 0.5+i, L"한글" );
			fwprintf( pFile, L"%d, %f, %s \n", i, 0.5+i, L"확인" );
			fwprintf( pFile, L"%d\t%f\t%s \n", i, 0.5+i, L"유니코드" );
		}
		fclose( pFile );
	}

	return 0;
}



※결과

한글이 깨진다.


설정 후에는 제대로 나온다.





※요약

ferror : 개방된 파일에서 데이터 조작시 에러가 발생되었는지 조사

feof : 개방된 파일에서 파일의 끝을 조사



※함수 원형 및 설명

int ferror( FILE *stream );
//stream : 개방된 FILE 구조체의 포인터
//반환값 : 에러가 발생했으면 true, 아니면 false

int feof( FILE *stream );
//stream : 개방된 FILE 구조체의 포인터
//반환값 : 파일의 끝이면 true, 끝이 아니면 false



※예제

#include <stdio.h>

#define print(ch) printf( "%x %c\n", ch, ch )

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "r" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		char chTemp;

		while( !feof( pFile ) )
		{
			chTemp = fgetc( pFile );

			if( ferror(pFile) )
			{
				printf("읽기 에러");
				break;
			}

			print( chTemp );
		}

		fclose( pFile );
	}

	return 0;
}




※요약

fgetpos : 개방된 파일에서 파일 포인터의 위치를 얻는다.

fsetpos : 개방된 파일에서 파일 포인터의 위치를 설정한다.



※함수 원형 및 설명

int fgetpos( FILE *stream, fpos_t *pos );
//stream : 개방된 FILE 구조체의 포인터
//pos : 현재 파일 포인터를 읽어올 변수
//반환값 : 성공 시 0, 실패 시 0이 아닌 값

int fsetpos( FILE *stream, const fpos_t *pos );
//stream : 개방된 FILE 구조체의 포인터
//pos : 파일 포인터 위치를 설정할 값
//반환값 : 성공 시 0, 실패 시 0이 아닌 값


※예제

#include <stdio.h>

#define print(n) printf( "%lld\n", n )

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "w+" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		fpos_t pos;
		print( ftell(pFile) );			//fopen 후 파일 포인터 위치 확인

		fputs( "0123456789", pFile );
		fgetpos( pFile, &pos );
		print( pos );					//fputs 후 파일 포인터 위치 확인

		pos = 5;
		fsetpos( pFile, &pos );
		
		fgetpos( pFile, &pos );
		print( pos );					//fsetpos 후 파일 포인터 위치 확인

		fclose( pFile );
	}

	return 0;
}





※요약

rewind : 개방된 파일에서 파일 포인터의 위치를 0으로 설정한다.



※함수 원형 및 설명

void rewind( FILE *stream );
//stream : 개방된 FILE 구조체의 포인터


※예제

#include <stdio.h>

#define print(n) printf( "%ld\n", n )

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "w+" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		print( ftell(pFile) );			//fopen 후 파일 포인터 위치 확인

		fputs( "0123456789", pFile );
		print( ftell(pFile) );			//fputs 후 파일 포인터 위치 확인

		rewind( pFile );
		print( ftell(pFile) );			//rewind 후 파일 포인터 위치 확인

		fclose( pFile );
	}

	return 0;
}





※요약

fseek : 개방된 파일에서 파일 포인터의 위치를 설정한다.



※특징

fseek 함수를 이용해 읽어온 파일의 크기를 구할 수도 있다.

fseek( stream, 0L, SEEK_END );
int nFileSize = ftell( stream );


※함수 원형 및 설명

int fseek( FILE *stream, long offset, int origin );
//stream : 개방된 FILE 구조체의 포인터
//offset : origin으로부터의 오프셋, 양수 또는 음수 가능
//origin : SEEK_SET, SEEK_CUR, SEEK_END 중 하나의 값
//		SEEK_SET : 파일 시작점(BOF)에서 offset만큼 이동
//		SEEK_CUR : 파일 포인터의 현재 위치에서 offset만큼 이동
//		SEEK_END : 파일의 끝(EOF)에서 offset만큼 이동
//반환값 : 0 (실패 시 0이 아닌 값)


※예제

#include <stdio.h>

#define print(n) printf( "%ld\n", n )

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "w+" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		print( ftell(pFile) );			//fopen 후 파일 포인터 위치 확인

		fputs( "0123456789", pFile );
		print( ftell(pFile) );			//fputs 후 파일 포인터 위치 확인

		fseek( pFile, 0L, SEEK_SET );    //처음 위치로 설정
		print( ftell(pFile) );			//fseek 후 파일 포인터 위치 확인

		fseek( pFile, 6L, SEEK_SET );    //처음 위치에서 6번 뒤로 설정
		print( ftell(pFile) );			//fseek 후 파일 포인터 위치 확인

		fseek( pFile, -2L, SEEK_CUR );    //현재 위치(6)에서 2번 앞으로 이동
		print( ftell(pFile) );			//fseek 후 파일 포인터 위치 확인

		fseek( pFile, 0L, SEEK_END );    //파일 끝으로 이동
		print( ftell(pFile) );			//fseek 후 파일 포인터 위치 확인

		fclose( pFile );
	}

	return 0;
}




※요약

ftell : 개방된 파일 스트림의 현재 파일 포인터의 위치를 구한다.



※특징

파일 포인터는 데이터를 읽거나 쓸 위치를 가르킨다.

파일 포인터는 데이터를 읽거나 쓴 크기 만큼 자동으로 증가하며,

위치를 수동으로 지정하려면 fseek함수나 fsetpos함수로 한다.



※함수 원형 및 설명

long ftell( FILE *stream );
//개방된 FILE 구조체의 포인터
//현재 파일 포인터의 위치를 반환


※예제

#include <stdio.h>

#define print(n) printf( "%ld\n", n )

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "w" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		long lp;

		lp = ftell( pFile );
		print( lp );

		fputs( "13579", pFile );

		lp = ftell( pFile );
		print( lp );

		fclose( pFile );
	}

	return 0;
}





※요약

fwrite : 개방된 파일에 바이트 단위로 쓴다.



※함수 원형 및 설명

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
//buffer : 파일에 저장할 데이터 버퍼의 포인터
//size_t : 출력할 항목의 사이즈
//count : 출력할 항목의 개수
//stream : 개방된 FILE 구조체 포인터
//반환값 : 실제로 쓴 데이터 항목의 개수(count), 에러 시 count보다 작은 수


※예제

#include <stdio.h>

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "w+t" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		char buffer[] = { 'x' , 'y' , 'z' };

		int nResult = fwrite( buffer, sizeof(char), sizeof(buffer), pFile );
		if( nResult < sizeof(buffer) )
		{
			if( ferror(pFile) )
			{
				//파일 읽기 에러
			}
			if( feof(pFile) )
			{
				//파일 끝 도달
			}
		}

		fclose( pFile );
	}

	return 0;
}



※요약

fread : 개방된 파일에서 바이트 단위로 파일을 읽는다.



※함수 원형 및 설명

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
//buffer : 파일 데이터를 읽어서 저장할 버퍼의 포인터
//size_t : 항목의 사이즈
//count : 항목의 개수, 읽어올 횟수
//stream : 개방된 FILE 구조체 포인터
//반환값 : 실제로 읽은 데이터 항목의 개수, 에러 시 count보다 작은 수


※예제

이번 예제는 Point Cloud 프로그램에서 사용하는 *.ply파일을 읽는 예제다.

파일의 구조는 헤더와 데이터로 나눠져 있으며, 예제에 주석으로 헤더, 데이터 읽는 부분을 표시하였다.

파일 헤더의 내용은 포맷과 점의 개수 표시, 데이터 타입, 데이터 순서 등이고 

데이터의 내용은 헤더에 표시된 점 개수 만큼의 x, y, z, r, g, b 값이다.

데이터의 내용을 읽을 때 fread로 데이터 타입 만큼의 바이트를 읽는다.


Wisconsin-Madison Capital.ply


#include <stdio.h>

struct tagData
{
	float x;
	float y;
	float z;

	unsigned char red;
	unsigned char green;
	unsigned char blue;
};

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Wisconsin-Madison Capital.ply", "rt+" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		tagData	*Data;
		int		nVertexCnt=0;

		{//헤더 읽기
			fscanf( pFile, "%*s \n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %d\n", &nVertexCnt );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s \n" );
		}
		
		Data = new tagData[ nVertexCnt ];

		{//데이터 읽기
			for( int i=0 ; i<nVertexCnt ; ++i )
			{
				fread( &Data[ i ].x, sizeof( float ), 1, pFile );
				fread( &Data[ i ].y, sizeof( float ), 1, pFile );
				fread( &Data[ i ].z, sizeof( float ), 1, pFile );

				fread( &Data[ i ].red, sizeof( unsigned char ), 1, pFile );
				fread( &Data[ i ].green, sizeof( unsigned char ), 1, pFile );
				fread( &Data[ i ].blue, sizeof( unsigned char ), 1, pFile );
			}
		}
		fclose( pFile );
	}

	return 0;
}




※요약

fputc : 개방된 파일에 단일 문자를 쓴다.



※함수 원형 및 설명

int fputc( int c, FILE *stream );
⁄⁄c : 개방된 파일에 쓸 문자 또는 ASCII 값
⁄⁄stream : 개방된 FILE 구조체의 포인터
⁄⁄반환값 : 읽은 문자 값(int), 파일 끝 또는 에러 시 EOF(-1)


※예제

#include <stdio.h>

#define print(n) printf( "%x %c\n", n, n )

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "w" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		int nResult = fputc( 'T', pFile );
		print( nResult );

		fclose( pFile );
	}

	return 0;
}




※요약

fgetc : 개방된 파일의 단일 문자를 읽는다.



※함수 원형 및 설명

int fgetc( FILE *stream );
//stream : 개방된 FILE 구조체의 포인터
//반환값 : 읽은 문자 값(int), 파일 끝 또는 에러 시 EOF(-1)


※예제

#include <stdio.h>

#define print(ch) printf( "%x %c\n", ch, ch )

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Text.txt", "r" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		char chTemp;

		while( !feof( pFile ) )
		{
			chTemp = fgetc( pFile );
			print( chTemp );
		}

		fclose( pFile );
	}

	return 0;
}


+ Recent posts