Student DB

coh·2022년 5월 29일
0

C

목록 보기
1/1

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;
}
profile
Written by coh

0개의 댓글