|
안녕하세요.. ^^
죄송합니다.. 게시판을 보니 비주얼c++을 위한 질문게시판 같은대.. 자꾸 c 질문을 올려서요... ㅡㅡ;;
어디다가 올릴지 애매해서요.. 이해해주세요... ㅡㅡ;;
궁금한게 있어서요....
저기 함수를 보면 deletes라는 함수가 있잖아요..(아래 소스에..)
for(i = 0; i < n; i++)
{
if(strcmp(in[i].title, dele) == 0)
{
strcpy(in[i].title, "");
strcpy(in[i].author, "");
in[i].value = 0;
fseek(f, pass, 0);
fwrite(&in[i], sizeof(struct book), 1, f);
output(in, f);
return;
}
printf("%lu 음헤헤", pass);
pass += sizeof(struct book);
}
이런 코드가 있습니다... 여기서 fwrite에 data를 쓸때.. 자꾸 화일의 끝에만 붙는군요...
물론 화일을 a+로 선언함으로써 읽고 쓸수 있게 선언해 놨는대두요...
fseek로 화일의 처음으로 보내봐도 결과는 같습니다.. 심지어 rewind(f)라는 문장으로 무조건
화일의 처음으로 가게 했는대두 data는 화일의 끝에 붙는군요... ㅡㅡ;;
제가 지금 알고리즘을 잘못이해하고 있는건지(내가짠건대두..ㅡㅡ;;) 아니면 fwrite의 정확한 이해
가 부족한건지... 제가 알기론 fwrite(&in[i], sizeof(struct book), 1, f); 이 문장은 in[i] 번째
에 있는 데이터부터 sizeof(struct book)의 크기만큼 1 하나를 f가 가리키는 화일에 써라. 라고
알고 있거든요... 그리고 fseek(f, pass, 0); 은 f 가 가리키는 화일을 0 or SEEK_SET 처음으로
가서 pass만큼 떨어진 곳으로 화일이동을 하는거라구 알고있습니다.(처음에서 pass만큼 떨어진곳
으로 이동) 하긴 c를 한지가 오래되놔서 잘 기억은 안나는군요... ㅡㅡ;;
암튼 고수분들의 도움이 필요함니다...
그리고 deletes라는 함수는 원래는 구조체에서 하나의 구조를 삭제하는건대... 어떻게 하는건지 모
르겠군요.. 혹 아시는 분 있나요?? 그러니깐 화일에 써있는 data를 삭제하는 방법..... ㅡㅡ;;
아 링크드 리스트를 이용하지 않고 말이죠...^^
그럼 부탁점 드리겠습니다..
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXBOOK 10
struct book {
char title[10];
char author[10];
float value;
};
void input(struct book *, FILE *, int n);
int output(struct book *, FILE *);
void deletes(struct book *, FILE *, int n);
void adjust(struct book *, FILE *, int n);
int main(void)
{
struct book info[MAXBOOK];
FILE *fp;
char del[5];
char adj[5];
int filecount;
if((fp = fopen("book.dat", "a+b")) == NULL)
{
printf("음 파일이 잘못됐네요.. ㅡㅡ;;");
exit(1);
}
printf("여기 파일의 초기 목록이 있습니다.\n");
filecount = output(info, fp);
if(filecount != 0)
{
printf("책을 삭제 하시겠습니까?? Y or N 를 입력하세요.\n");
gets(del);
if(strcmp(del, "y") == 0)
deletes(info, fp, filecount);
printf("책을 수정 하시겠습니까?? Y or N 를 입력하세요.\n");
gets(adj);
if(strcmp(adj, "y") == 0)
adjust(info, fp, filecount);
}
input(info, fp, filecount);
printf("여기 파일의 총 목록이 있습니다...\n");
filecount = output(info, fp);
printf("파일에 있는 총 목록은 %d 입니다.\n",filecount);
fclose(fp);
return 0;
}
void input(struct book *in, FILE *f, int n)
{
int datanumber = n;
printf("새로 입력하려는 자료를 입력하세요.. 없으면 그냥 엔터를 치세요..\n");
printf("책의 제목을 입력하세요.\n");
while(datanumber < MAXBOOK && gets(in[datanumber].title) != NULL && in[datanumber].title[0] != '\0')
{
printf("책의 저자를 입력하세요.\n");
gets(in[datanumber].author);
printf("책의 가격을 입력하세요.\n");
scanf("%f", &in[datanumber].value);
while(getchar() != '\n')
continue;
datanumber++;
if(datanumber < MAXBOOK)
printf("책의 제목을 입력하세요.\n");
}
if(datanumber > MAXBOOK)
{
printf("이런 파일 용량이 더이상 없네요...");
exit(1);
}
fwrite(&in[n], sizeof(struct book), datanumber - n, f);
}
int output(struct book *in, FILE *f)
{
int max = 0;
rewind(f);
while(max < MAXBOOK && fread(&in[max], sizeof(struct book), 1, f) == 1)
{
if(max == 0)
printf("파일의 목록입니다.\n");
printf("책의 제목은 %s 이고 책의 저자는 %s, 그리고 책의 가격은 %g 입니다.\n", in[max].title, in[max].author, in[max].value);
max++;
}
return max;
}
void deletes(struct book *in, FILE *f, int n)
{
char dele[10];
int i;
long pass = 0L;
printf("삭제할 책의 제목을 입력하세요.\n");
gets(dele);
for(i = 0; i < n; i++)
{
if(strcmp(in[i].title, dele) == 0)
{
strcpy(in[i].title, "");
strcpy(in[i].author, "");
in[i].value = 0;
fseek(f, pass, 0);
fwrite(&in[i], sizeof(struct book), 1, f);
output(in, f);
return;
}
printf("%lu 음헤헤", pass);
pass += sizeof(struct book);
}
printf("찾으시는 제목의 책이 목록에 없군요..\n");
}
void adjust(struct book *in, FILE *f, int n)
{
}
|