여러 종류의 자료형을 가진 데이터를 저장해야 하므로 구조체 배열을 사용한다. 도서 데이터는 프로그램 내 구조체 변수에 저장된다.
구조
프로그램에 데이터 구조와 데이터 값이 모두 포함된다.
// 구조체 BOOK 선언
typedef struct {
int bookid;
char bookname[20];
char publisher[20];
int price;
} BOOK;
// 구조체 배열 변수 BOOKS[]에 데이터 저장
int main(){
BOOK BOOKS[10];
BOOKS[1].bookid = 1;
strcpy(BOOKS[1].bookname, "첫 번째 책");
strcpy(BOOKS[1].publisher, "출판사");
BOOKS[1].price = 7000;
BOOKS[2].bookid = 2;
strcpy(BOOKS[1].bookname, "두 번째 책");
strcpy(BOOKS[1].publisher, "출판사");
BOOKS[1].price = 7000;
// 생략
return 0;
}
문제점 데이터 구조나 값을 수정하려면 프로그램 자체를 수정하고 다시 컴파일한 뒤 프로그램을 실행해야 한다. 즉, 컴파일 하는 동안 서비스가 중단되는 문제가 발생한다.
파일 시스템 사용
데이터를 별도의 파일에 저장할 수도 있다. 마찬가지로 구조체를 선언하고, 파일에서 데이터를 불러와 구조체 배열에 저장한다.
구조
// 구조체 BOOK 선언
typedef struct {
int bookid;
char bookname[20];
char publisher[20];
int price;
} BOOK;
// 파일에 저장된 데이터를 배열 BOOKS[]에 저장
int main(){
BOOK BOOKS[10];
int i = 1;
// "book.dat" 파일을 바이너리 모드(rb)로 읽기 위해 열기
fp = fopen("book.dat","rb");
// BOOK 구조체 크기만큼 메모리를 할당하고, 그 메모리 포인터를 bp로 받음
bp = (BOOK *)calloc(1,sizeof(BOOK));
// 파일에서 BOOK 구조체 크기만큼 데이터를 읽어 bp에 저장, 읽은 데이터가 없으면 종료
while(fread(bp, sizeof(BOOK), 1, fp) ! = 0) {
// bp에 저장된 데이터를 BOOKS 배열의 i번째 요소에 복사
BOOKS[i].bookid = bp->bookid;
strcpy(BOOKS[1].bookname, "첫 번째 책");
strcpy(BOOKS[1].publisher, "출판사");
BOOKS[1].price = 7000;
i++:
}
//생략
}
문제점 데이터가 수정될 때 다시 컴파일할 필요는 없지만 구조를 바꿔야 할 수 있고, 같은 파일을 여러 프로그램이 공유할 때 문제가 발생할 수 있다.
DBMS 사용
데이터를 DBMS에 저장하는 방법을 이용할 수도 있다. DBMS가 데이터 구조를 정의하고, 데이터를 관리하기 떄문에 데이터를 프로그램 내부에 저장하거나 별도의 파일에 저장하지 않는다.
이를 위해 SQL 언어를 추가로 사용한다. 이때, SQL을 embeded language, C를 host language라 한다.