안녕하세요? CK_ONE 입니다.
오랫만에 올리는 강좌네요..
사실 제가 생각하는 기본 강좌는 헬로 월드, 네트웍, 파일 IO, 쓰레드 정도입니다.
현재 쓰레드가 빠졌군요..
저 정도만 알면 나머지는 그냥 경험에서 나오는 기교(?) 정도라고 생각합니다.
그렇지만, 처음 배울때는 정말 막막하기 마련이죠.. 그래서 이런저런 강좌를 찾아보게 되구요..
그래서 저도 이런저런 강좌를 생각나는데로 써보려고 합니다.
보시는 분의 등급(? ㅡㅡ;;)에 따라서 어려운 것도 있을테고, 땅짚고 헤엄치는것도 있을겁니다.
대충 맞춰서 보세요 ^^
그럼 이번 강좌를 대충 설명해볼께요..
프로그램을 만들다 보면 설정 사항을 저장해야 할 일이 생깁니다.
예를들어 봄틀의 경우 북마크 저장같은것이 그것이지요..
이때 저장에는 여러가지 방법이 있습니다만, 간단하게 파일을 사용하기로 합니다.
파일에 쓸때도 바이너리로 쓰는 방법 즉, 구조체를 통채로 저장하는 방법(이번 강좌의 저장 방법입니다.)과
INI 파일등 편집가능한 파일을 쓰는 방법이 있습니다.
바이너리로 쓰는 방법은 읽고, 쓰기가 편리합니다. 물론 개발자의 입장에서 말이죠..
하지만 사용자가 그 값을 보거나 변경시키기 어렵습니다.
편집가능한 파일을 쓰게 되면 User가 값을 보거나 변경하기는 쉽지만, 개발자가 값을 저장하고 읽어오는데
약간 귀찮아지게 됩니다.
용도에 맞게 골라서 사용하시면 되겠습니다.
그럼 이번에는 바이너리로 저장하는 방법에 대해 알아보겠습니다.
오랫만에 올리는 강좌네요..
사실 제가 생각하는 기본 강좌는 헬로 월드, 네트웍, 파일 IO, 쓰레드 정도입니다.
현재 쓰레드가 빠졌군요..
저 정도만 알면 나머지는 그냥 경험에서 나오는 기교(?) 정도라고 생각합니다.
그렇지만, 처음 배울때는 정말 막막하기 마련이죠.. 그래서 이런저런 강좌를 찾아보게 되구요..
그래서 저도 이런저런 강좌를 생각나는데로 써보려고 합니다.
보시는 분의 등급(? ㅡㅡ;;)에 따라서 어려운 것도 있을테고, 땅짚고 헤엄치는것도 있을겁니다.
대충 맞춰서 보세요 ^^
그럼 이번 강좌를 대충 설명해볼께요..
프로그램을 만들다 보면 설정 사항을 저장해야 할 일이 생깁니다.
예를들어 봄틀의 경우 북마크 저장같은것이 그것이지요..
이때 저장에는 여러가지 방법이 있습니다만, 간단하게 파일을 사용하기로 합니다.
파일에 쓸때도 바이너리로 쓰는 방법 즉, 구조체를 통채로 저장하는 방법(이번 강좌의 저장 방법입니다.)과
INI 파일등 편집가능한 파일을 쓰는 방법이 있습니다.
바이너리로 쓰는 방법은 읽고, 쓰기가 편리합니다. 물론 개발자의 입장에서 말이죠..
하지만 사용자가 그 값을 보거나 변경시키기 어렵습니다.
편집가능한 파일을 쓰게 되면 User가 값을 보거나 변경하기는 쉽지만, 개발자가 값을 저장하고 읽어오는데
약간 귀찮아지게 됩니다.
용도에 맞게 골라서 사용하시면 되겠습니다.
그럼 이번에는 바이너리로 저장하는 방법에 대해 알아보겠습니다.
PSPDEV_06 강좌 닫기
이 프로그램의 목적은 다음과 같습니다.
화면에 정해진 숫자와 문자열을 표시합니다.
그 숫자와 문자열을 프로그램 종료시 저장하고, 다시 프로그램을 로드하면
저장된 숫자와 문자열을 화면에 표시합니다.
값을 저장할 구조체는 다음과 같습니다.
설정을 저장하고 로드하는 시나리오는 다음과 같습니다.
프로그램 시작시 설정 파일이 해당 path에 존재하는지를 확인하고, 설정 파일이 존재하면
설정 파일을 읽어 그 값을 표시하고, 설정 파일이 없으면 기본 값을 읽어옵니다.
값의 저장은 프로그램 종료 시 한번만 수행합니다.
메인 함수는 다음과 같습니다.
설정 파일을 로드한 뒤에 화면에 값을 표시하도록 합니다.
컨트롤의 변화를 감지하여 네모 키가 눌린 경우에만 값이 변하도록 합니다.
save 파일의 경로를 어떤 특정 경로로 지정해 둔다면, 경로를 맞춰서 홈브류를 설치해줘야 합니다.
그리고 프로그램시에 그 경로를 입력해 주어야 하죠..
이것을 좀 더 똑똑하게 처리해보겠습니다.
바로 init_path 라는 함수를 이용하시면 되겠습니다.
init_path를 호출하는 부분을 보시면 main 함수의 argv[0]을 parameter로 넘기는 걸 볼 수 있습니다.
main 함수의 두번째 paramter에는 해당 홈브류의 path가 들어있습니다.
하지만 여기에는 실행 파일 이름까지 들어있으므로 그것을 제거해 주어야 합니다.
예를 들어 ms0:/PSP/GAME150/BOMTL/EBOOT.PBP 라고 들어있게 됩니다.
여기서 우리는 ms0:/PSP/GAME150/BOMTL/ 까지만 필요하기 때문에, 문자열 뒤에서 부터 '/'를 찾은 뒤,
그 뒤를 NULL로 처리해 줍니다. 그런뒤에 우리가 저장할 파일 명을 붙여주면 됩니다.
간단하죠? ^^
다음은 설정파일을 읽어오는 루틴입니다.
아주 간단합니다.
위에서 만든 path로 파일을 열고 파일을 연 경우 구조체의 크기만큼 읽어오면 됩니다.
만약 파일이 없는 경우에는 기본 설정을 읽어오는 함수를 호출합니다.
기본값으로는 line은 0 station은 "기본값"을 주었습니다.
그럼 이제 설정 파일을 저장해볼까요?
이것도 무지하게 간단합니다.
설정 파일을 읽었을 대와 마찬가지로 구조체를 그대로 써주면 됩니다.
훔...너무 간단해서 할말이 없군요 ^^;;
남은건 display 함수인데, 이것은 설정을 읽어서 그 값을 화면에 표시해 주는것이 이 함수의 역할입니다.
그럼 소스를 받아서 한번 실행해 보세요~ ^^
화면에 정해진 숫자와 문자열을 표시합니다.
그 숫자와 문자열을 프로그램 종료시 저장하고, 다시 프로그램을 로드하면
저장된 숫자와 문자열을 화면에 표시합니다.
값을 저장할 구조체는 다음과 같습니다.
/*
* 한개의 int값과 256자의 character를 가질 수 있는 구조체를 선언합니다.
*
* 이 구조체를 통채로 파일에 저장했다가 읽어올것 입니다.
*/
typedef struct {
int line;
char station[MAX_STRING];
} struct_config;
* 한개의 int값과 256자의 character를 가질 수 있는 구조체를 선언합니다.
*
* 이 구조체를 통채로 파일에 저장했다가 읽어올것 입니다.
*/
typedef struct {
int line;
char station[MAX_STRING];
} struct_config;
설정을 저장하고 로드하는 시나리오는 다음과 같습니다.
프로그램 시작시 설정 파일이 해당 path에 존재하는지를 확인하고, 설정 파일이 존재하면
설정 파일을 읽어 그 값을 표시하고, 설정 파일이 없으면 기본 값을 읽어옵니다.
값의 저장은 프로그램 종료 시 한번만 수행합니다.
메인 함수는 다음과 같습니다.
설정 파일을 로드한 뒤에 화면에 값을 표시하도록 합니다.
컨트롤의 변화를 감지하여 네모 키가 눌린 경우에만 값이 변하도록 합니다.
int main(int argc, char *argv[])
{
int i;
SceCtrlData pad;
{
int i;
SceCtrlData pad;
pspDebugScreenInit();
SetupCallbacks();
HFontInit();
init_path(argv[0]);
SetupCallbacks();
HFontInit();
init_path(argv[0]);
// 현재 설정을 읽어옵니다.
isLoad = loadConfig();
isLoad = loadConfig();
while(1)
{
// 화면을 표시합니다.
display();
{
// 화면을 표시합니다.
display();
// ctrl의 변화를 읽어옵니다.
sceCtrlReadBufferPositive((SceCtrlData *)(&pad), 1);
// 네모 버튼이 눌렸을 경우에만 반응합니다.
if(pad.Buttons & PSP_CTRL_SQUARE)
{
if(conf.line < 4)
conf.line++;
else
conf.line = 1;
// 연속으로 키가 눌리는 것을 막기위해 시간을 지연합니다.
for(i = 0; i < 10; i++)
sceDisplayWaitVblankStart();
}
}
sceCtrlReadBufferPositive((SceCtrlData *)(&pad), 1);
// 네모 버튼이 눌렸을 경우에만 반응합니다.
if(pad.Buttons & PSP_CTRL_SQUARE)
{
if(conf.line < 4)
conf.line++;
else
conf.line = 1;
// 연속으로 키가 눌리는 것을 막기위해 시간을 지연합니다.
for(i = 0; i < 10; i++)
sceDisplayWaitVblankStart();
}
}
sceKernelSleepThread();
return 0;
}
return 0;
}
save 파일의 경로를 어떤 특정 경로로 지정해 둔다면, 경로를 맞춰서 홈브류를 설치해줘야 합니다.
그리고 프로그램시에 그 경로를 입력해 주어야 하죠..
이것을 좀 더 똑똑하게 처리해보겠습니다.
바로 init_path 라는 함수를 이용하시면 되겠습니다.
void init_path(char* path)
{
char* p;
p = strrchr(path, '/');
*(p+1) = '\0';
strcpy(initPath, path);
strcat(initPath, SAVE_FILE);
}
{
char* p;
p = strrchr(path, '/');
*(p+1) = '\0';
strcpy(initPath, path);
strcat(initPath, SAVE_FILE);
}
init_path를 호출하는 부분을 보시면 main 함수의 argv[0]을 parameter로 넘기는 걸 볼 수 있습니다.
main 함수의 두번째 paramter에는 해당 홈브류의 path가 들어있습니다.
하지만 여기에는 실행 파일 이름까지 들어있으므로 그것을 제거해 주어야 합니다.
예를 들어 ms0:/PSP/GAME150/BOMTL/EBOOT.PBP 라고 들어있게 됩니다.
여기서 우리는 ms0:/PSP/GAME150/BOMTL/ 까지만 필요하기 때문에, 문자열 뒤에서 부터 '/'를 찾은 뒤,
그 뒤를 NULL로 처리해 줍니다. 그런뒤에 우리가 저장할 파일 명을 붙여주면 됩니다.
간단하죠? ^^
다음은 설정파일을 읽어오는 루틴입니다.
int loadConfig()
{
int fd;
{
int fd;
fd = sceIoOpen(initPath, PSP_O_RDONLY, 0777);
if(fd >= 0)
{
sceIoRead(fd, &conf, sizeof(conf));
sceIoClose(fd);
return 1;
}
else
{
loadDefaultConfig();
}
return 0;
}
if(fd >= 0)
{
sceIoRead(fd, &conf, sizeof(conf));
sceIoClose(fd);
return 1;
}
else
{
loadDefaultConfig();
}
return 0;
}
아주 간단합니다.
위에서 만든 path로 파일을 열고 파일을 연 경우 구조체의 크기만큼 읽어오면 됩니다.
만약 파일이 없는 경우에는 기본 설정을 읽어오는 함수를 호출합니다.
void loadDefaultConfig()
{
conf.line = 0;
strcpy(conf.station, "기본값");
}
{
conf.line = 0;
strcpy(conf.station, "기본값");
}
기본값으로는 line은 0 station은 "기본값"을 주었습니다.
그럼 이제 설정 파일을 저장해볼까요?
이것도 무지하게 간단합니다.
void saveConfig()
{
int fd;
{
int fd;
fd = sceIoOpen(initPath, PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777);
if(fd >= 0)
{
sceIoWrite(fd, &conf, sizeof(conf));
sceIoClose(fd);
}
}
if(fd >= 0)
{
sceIoWrite(fd, &conf, sizeof(conf));
sceIoClose(fd);
}
}
설정 파일을 읽었을 대와 마찬가지로 구조체를 그대로 써주면 됩니다.
훔...너무 간단해서 할말이 없군요 ^^;;
남은건 display 함수인데, 이것은 설정을 읽어서 그 값을 화면에 표시해 주는것이 이 함수의 역할입니다.
그럼 소스를 받아서 한번 실행해 보세요~ ^^
댓글