※요약

chmod : 파일이나 디렉토리의 읽기/쓰기 접근 권한을 변경한다.

change mode



※특징

pmode 값은 _S_IREAD와 _S_IWRITE 값만 사용한다.



※함수 원형 및 설명

int chmod( const char *filename, int pmode );
//filename : 파일의 경로
//pmode : 파일에 설정할 접근 모드 값
//반환값 : 정상 일 때 0, 에러 시 -1

접근 권한

설 명

비 고

_S_IREAD

읽기 접근 권한

-

_S_IWRITE

쓰기 접근 권한

_S_IREAD 속성 해제



※예제

#include <stdio.h>
#include <sys⁄stat.h>    //_S_IREAD, _S_IWRITE
#include <io.h>          //chmod

int main( )
{
	char strPath[] = { "D:\\Text.txt" };
	
	int nResult = chmod( strPath, _S_IREAD );

	if( nResult == 0 )
	{
		printf( "읽기 전용으로 속성 변경 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "실패 - " );
	}

	return 0;
}





※요약

mkdir : 디렉토리(폴더)를 생성한다.

make directory


※특징

만들려는 폴더가 이미 존재하면 errno는 EEXIST,

폴더가 부정확하면 errno는 ENOENT


※함수 원형 및 설명

int mkdir( const char *dirname );
//dirname : 생성할 디렉토리 경로와 이름
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>
#include <direct.h>		//mkdir
#include <errno.h>		//errno

int main( )
{
	char strFolderPath[] = { "D:\\CreateFolder" };
	
	int nResult = mkdir( strFolderPath );

	if( nResult == 0 )
	{
		printf( "폴더 생성 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "폴더 생성 실패 - 폴더가 이미 있거나 부정확함\n" );
		printf( "errorno : %d", errno );
	}

	return 0;
}





※요약

rmdir : 디렉토리(폴더)를 삭제한다.



※특징

디렉토리 내에 파일이 존재하거나 사용중이면 삭제할 수 없다.

삭제 전에 디렉토리의 존재 유무 확인 후 삭제하면 좋다.



※함수 원형 및 설명

int rmdir( const char *dirname );
//dirname : 삭제할 디렉토리 경로
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>
#include <direct.h>		//rmdir
#include <errno.h>		//errno

int main( )
{
	char strFolderPath[] = { "D:\\TestFolder2" };
	
	int nResult = rmdir( strFolderPath );

	if( nResult == 0 )
	{
		printf( "폴더 삭제 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "폴더 삭제 실패 - 폴더 안에 파일이 있거나 사용중\n" );
		printf( "errorno : %d", errno );
	}

	return 0;
}





※요약

remove : 지정한 경로의 파일을 삭제한다.



※특징

읽기 전용, 숨김, 시스템 속성 등을 갖는 파일은 삭제할 수 없다.

또 현재 사용 중인 파일도 삭제할 수 없다.



※함수 원형 및 설명

int remove( const char *path );
//path : 파일 경로
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>

int main( )
{
	char strPath[] = { "D:\\Text2.txt" };
	
	int nResult = remove( strPath );

	if( nResult == 0 )
	{
		printf( "파일 삭제 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "파일 삭제 실패" );
	}

	return 0;
}



오뇽 로또 프로그램에 대한 사용 방법 설명입니다.


프로그램 설명에 앞서 간단히 나눔 로또에 대해 간단히 알아보자면, 45개 번호 중 6개를 고르는 시스템이며 1등은 전체 경우의 수 중에 단 하나의 조합만 존재합니다. 고로 나눔 로또의 당첨 확률은 45C6 = (45x44x43x42x41x40)/(6x5x4x3x2x1) = 8,145,060 입니다. 중복되지 않는 조합으로 8,145,060장의 로또를 사면 8145060x1000원 = 81억 4506만원 이네요. 575회 로또 기준 당첨자는 8명이고 각 16억 9926만 7천원을 받았으므로 81억을 들여 모든 경우의 수 만큼 로또를 사도 크게 적자입니다.


※용어 설명

- 설명을 위해 쓰인 번호 2, 8, 20, 30, 33, 34는 575회 로또 당첨 번호임 -


총합 : 6개의 번호를 모두 더한 합, 2, 8, 20, 30, 33, 34의 합은 127

저고율 : 1~22를 낮은수(저), 23~45를 고(높은수)라고 하며 575회의 저고 비율은 3:3

홀짝율 : 6개의 번호 중 홀수 개수와 짝수 개수의 비율, 575회의 경우 1:5

연번 : 연속되어 있는 번호의 쌍, 575회의 경우 33, 34 1쌍만이 연속되므로 연번은 1쌍

첫수합 : 일의 자리는 빼고 십의 자리 숫자만 더해서 나누기 10 한 수, 2, 8, 20, 30, 33, 34 = (20 + 30 + 30 + 30)/10 = 11

끝수합 : 십의 자리는 빼고 일의 자리 숫자만 더한 수, 2, 8, 20, 30, 33, 34 = 17

고저합 : 번호1과 번호6의 합 - 2, 8, 20, 30, 33, 34 = 2 + 34 = 36

간격합 : 각 번호들의 차를 더한게 간격합, 혹은 번호6 - 번호1이 간격합 - 2, 8, 20, 30, 33, 34 = 34 - 2 = 32

123합 : 번호1 + 번호2 + 번호3을 더한 값

456합 : 번호4 + 번호5 + 번호6을 더한 값

고정수 : 사용자가 번호를 생성할 때 반드시 포함시킬 수

제외수 : 사용자가 번호를 생성할 때 반드시 제외시킬 수


※프로그램 설명 1/3 - 대략적인 설명

1. 검색탭

전 회차 로또 당첨 번호들을 확인할 수 있는 탭입니다. 최신 당첨 번호는 매주 토요일 20시 50분 이후에 자동으로 업데이트 됩니다. 아래 보면 검색 조건이라는 항목이 있는데, 검색조건을 통해 원하는 범위의 데이터만 조회할 수도 있습니다.



2. 생성탭

로또 번호를 생성하는 탭입니다. 원하는 조건을 줘서 생성하거나 완전 자동으로 번호를 생성해 줍니다. 생성한 번호는 파일(txt, 엑셀) 저장하거나 불러올 수 있습니다.



3. 집계탭

프로그램 자체적으로 집계를 내는 집계탭입니다. 사실 "통계"라고 이름 짓고 싶었는데 로또 통계와 겹쳐 그냥 집계로 했습니다. 여기서는 다른 사람들의 패턴을 대충 볼 수 있습니다.



4. 통계창

통계1탭, 통계2탭, 통계3탭을 담고 있는 통계창입니다. 이곳에서는 전 회차 당첨 번호들을 토대로 통계를 내는 창입니다. 지난 1회부터 575회까지 가장 많이 당첨된 번호라든가, 지난 15회 동안 안나온 번호 등을 확인할 수 있습니다.



프로그램 설명 2/3 - 검색탭 세부 사항

1. 조건 검색

아래 그림은 검색 조건 중 "총합 범위", "홀짝 비율", "연번 개수", "추첨일"의  조건을 줘서 검색한 결과입니다. 조건처럼 총합은 80~150 사이가, 홀짝 비율은 3:3과 4:2 등의 검색 결과가 나왔습니다.


2. 반전 검색

반전 검색이랑 조건에 반대되는 조건을 검색하는 기능입니다.아래 그림처럼 총합 범위를 70~220으로 주고 "반전 검색" 버튼을 누르면 총합이 70~220가 아닌 값들만 조회됩니다. 검색 결과는 아래처럼 64나 48, 69, 238 등, 70~220사이가 아닌 회차들이 검색되었습니다.



3. 파일 출력 및 복사

원하는 회차만 엑셀로 출력하거나 복사하는 방법에 대한 설명입니다. 원하는 행들을 선택하고, 선택한 행 중에서 마우스 오른쪽 클릭을 하면 아래와 같이 팝업 메뉴가 뜹니다. 엑셀로 출력하려면 "선택한 항목 엑셀 파일로 저장"을 선택합니다. 복사하려면 "선택 항목 복사"를 누르거나 Ctrl+C 누르면 복사가 됩니다. 복사한 것들은 메모장이나 엑셀에 Ctrl+V로 붙여넣기 하시면 됩니다.


※프로그램 설명 3/3 - 생성탭 세부 사항

1. 조건 생성

조건을 줘서 번호를 생성하는 방법입니다. 주로 통계창의 통계탭들을 보면서 번호를 생성합니다. 아래는 간단한 예로 "저고 비율", "홀짝 비율", "연번 개수"만 조건을 주고 생성한 결과 화면 입니다. 조건처럼 저고율 3:3, 홀짝율 3:3, 연번 3쌍이 나왔습니다. 아무 조건 없이 생성할 경우 완전 자동모드입니다. 귀차니즘 때문에, 혹은 운에 맡겨보고 싶은 사람들이 자주 사용합니다.



2. 임의 번호 입력

이번에는 자신이 번호를 직접 입력하는 임의 번호 입력에 대한 내용입니다. 임시 입력 공간은 3개가 있고, "입력" 버튼을 누르면 누른 순서대로 리스트에 추가됩니다. 번호가 입력되고 나면 총합이라든가 저고율 등이 자동으로 계산되어 입력됩니다.



3. 고정수/제외수 설정

고정수는 번호 생성시 꼭 포함되어야할 번호이고 제외수는 번호 생성시 꼭 제외되어야할 번호입니다. 아래 그림은 고정수 1, 45를, 제외수는 40, 41, 42, 43, 44로 설정하여 100개의 번호를 뽑은 창입니다. 고정수로 설정한 1, 45는 리스트에 무조건 들어가 있고 반대로 제외수로 설정한 40~44는 무조건 제외되서 생성됐습니다.



4. 중복 관련

좁은 조건 범위 내에서 번호들을 생성하다 보면 중복된 번호들이 생길 수 있습니다. 중복된 번호들이 있을때 중복된 횟수는 몇 번인지, 어떤 수들이 중복 되었는지 확인할 수 있습니다. "중복 항목 삭제"버튼을 누르면 중복된 항목들은 하나만 남기고 제거가 됩니다.


아래는 제 모니터 화면 캡쳐입니다.

프로그램 테스트 하는 중인데 올릴거라 과도하게 띄운 감이 있네요 - _-ㅋ

프로그램 테스트 할 때는 2~3개 띄워놓고 합니다.



※요약

access : 파일이나 디렉토리(폴더)의 존재 유무, 혹은 파일의 권한 및 속성을 조사할 때 사용한다.



※특징

주로 파일 및 디렉토리가 존재하는 지 조사할때 사용한다.



※함수 원형 및 설명

int access( const char *path, int mode );
//path : 파일이나 폴더의 전체 경로 또는 이름
//mode : 파일이나 폴더의 존재 유무 검사 또는 권한 조사(아래 표 참고)
//반환값 : 정상 시 0, 에러 시 -1



모드 설명

모 드

설 명

00

파일 및 디렉토리가 존재 하는지 조사

02

쓰기 접근이 허용되는지 조사

04

읽기 접근이 허용되는지 조사

06

읽기 및 쓰기가 허용되는지 조사




※예제

#include <stdio.h>
#include <io.h>		//access

int main( )
{
	char strPath[] = { "C:\\Windows" };
	
	int nResult = access( strPath, 0 );

	if( nResult == 0 )
	{
		printf( "지정한 경로에 파일⁄폴더가 존재 합니다." );
	}
	else if( nResult == -1 )
	{
		printf( "지정한 경로에 파일⁄폴더가 존재하지 않습니다." );
	}

	return 0;
}




※요약

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



원인

네이버 지식인 참고



※해결방법

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;
}



※결과

한글이 깨진다.


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


 

 

인터넷에서 첨부 파일을 다운받은 후 실행 시키려고 하면

아래와 같이 "Windows SmartScreen에서 인식할 수 없는 앱을 시작하지 못하게 했습니다."라는 메시지와 함께

프로그램을 실행하지 못하는 경우가 있습니다.



일시적으로 해제하는 방법과 영구적으로 해제하는 방법이 있습니다.


실행하려는 실행 파일의 속성 창을 띄워 차단 해제 버튼을 누르면 차단이 해제되고 실행이 됩니다.


아래는 SmartScreen 설정을 변경하여 영구적으로 차단을 해제하는 방법입니다.

보안상 위의 방법처럼 일시적으로 해재하는 걸 추천합니다.






※요약

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;
}



+ Recent posts