c언어 연습을 위해 간단한 Studen DB를 만들었다. 이진 파일로 저장하기 때문에 ./a.out을 하고 생성되는 StudentDB file을 어차피 볼 수가 없는데 만일 이것을 열면 자동으로 개행이 들어간다.. 그래서 그 DB는 더 이상 쓸 수가 없게 된다!
원래는 strcmp를 사용해서 string.h를 집어넣었는데 그 함수 하나만 쓰는데 header file을 다 include해야하나 싶어서 ft_strcmp함수 하나 만들고 헤더파일 빼버렸다.
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM_STUDNT 255
enum action {ADD, FIND, EXIT};
typedef struct{
int ID;
char name[8];
float score;
}Student;
int fileOpen(FILE** _fp, char* _filename, char* _mode);
int selectAction(void);
int printStudentInfo(Student* _info);
int addStudentInfo(FILE* _fp, Student* _info);
long findStudent(FILE* _fp, Student* _info);
int main(void)
{
FILE *fp = NULL;
Student data = {0};
fileOpen(&fp, "StudentDB", "ab+");
while(1){
switch (selectAction()){
case ADD:
addStudentInfo(fp, &data);
break;
case FIND:
if(findStudent(fp, &data) < 0)
printf("Cannot find the student\n");
else
printStudentInfo(&data);
break;
case EXIT:
exit(0);
}
}
}
int selectAction(void){
int sel = 0;
printf("[%d]add [%d]find [%d]exit: ", ADD, FIND, EXIT);
scanf("%d", &sel);
return sel;
}
int printStudentInfo(Student* _info)
{
printf("%d %s %.2f\n", _info->ID,_info->name, _info->score);
}
int addStudentInfo(FILE* _fp, Student* _info){
printf("Enter ID NAME SCORE : ");
scanf("%d %s %f", &_info->ID, (char *)&_info->name, &_info->score); getchar();
fseek(_fp, 0, SEEK_END);
fwrite(_info, sizeof(Student), 1, _fp);
return 0;
}
int ft_strcmp(char* dst, char* src)
{
int i = 0;
while(dst[i] == src[i])
{
if(dst[i] == 0)
return 0;
++i;
}
return dst[i] - src[i];
}
long findStudent(FILE* _fp, Student* _info){
char name[225] = {0};
printf("Name: ");
scanf("%s", name); getchar();
int elementSize = sizeof(Student);
fseek(_fp, 0, SEEK_SET);
while(!feof(_fp)){
fread(_info, elementSize, 1, _fp);
if(ft_strcmp(_info->name, name) == 0){
fseek(_fp, -elementSize, SEEK_CUR);
return ftell(_fp);
}
}
return -1;
}
int fileOpen(FILE** _fp, char* _fileName, char* _mode)
{
*_fp = fopen(_fileName, _mode);
if(!*_fp)
{
printf("Fail to open - %s\n", _fileName);
return -1;
}
return 0;
}