C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[10203] 안녕하세요...^^
허진오 [] 752 읽음    2001-08-22 18:18
안녕하세요.. ^^
죄송합니다.. 게시판을 보니 비주얼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)
{
}

+ -

관련 글 리스트
10203 안녕하세요...^^ 허진오 752 2001/08/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.