2015-01-03 3 views
-2

도와주세요. 지금까지 내 코드입니다. 레코드 삭제 기능이 작동하지 않으며 다음과 같은 조건으로 레코드 업데이트 기능을 도와 줄 수 있습니다 :

- 사용자에게 플레이어 이름을 입력하도록 요청하십시오.
- 사용자에게 플레이어 점수를 입력하도록 요청합니다.
- 사용자에게 플레이어 수준을 입력하도록 요청합니다.
- 플레이어 이름이 목록에 없다면 "[player name] 이름을 찾을 수 없습니다!"라는 메시지가 표시됩니다.파일의 레코드 파일을 업데이트하십시오.

고마워요.

#include <stdio.h> 
#include <string.h> 

struct Player { 
    char name[50]; 
    int score; 
    int level; 
}; 
struct Player data[50]; 
FILE *ptr; 
FILE *ptr2; 

int fileSize() 
{ 
    int lSize; 
    int end; 
    ptr = fopen("text.txt", "r"); 
    lSize = ftell (ptr); 
    fseek (ptr, 0, SEEK_END); 
    end = ftell (ptr); 
    fseek (ptr, lSize, SEEK_SET); 

    return end; 
} 

int getNoOfRecords() 
{ 
    return (fileSize()/(sizeof(struct Player))); 
} 

void deletePlayerRecord() 
{ 
    char name[50]; 
    int counter=0, i=0; 

    ptr2 = fopen("text2.txt","a"); 
    int records = getNoOfRecords(); 

    ptr = fopen("text.txt","a+"); 
    do { 
     printf("Input player name[1..10]: "); 
     scanf("%[^\n]s", name); 
     fflush(stdin); 
    } while (strlen(name)<1 || strlen(name)>10); 
    while(counter!=records) 
    { 
     fread(&data,sizeof(struct Player),1,ptr); 
     if(strcmp(data[i].name,name)==0) 
     { 

     } 
     else 
     { 
      fwrite(&data,sizeof(struct Player),1,ptr2); 
     } 
     counter++; 
    } 
    fclose(ptr); 
    fclose(ptr2); 
    remove("text.txt"); 
    rename("text2.txt","text.txt"); 
    printf("\n%s successfully deleted.\n\n", name); 
    printf("Press Enter to continue....\n\n"); 
    getchar(); 
} 

void updatePlayerRecord() 
{ 
    char name[50]; 
    int counter=0, i=0; 
    int records = getNoOfRecords(); 
    ptr = fopen("text.txt","a+"); 
    do { 
     printf("Input player name[1..10]: "); 
     scanf("%[^\n]s", name); 
     fflush(stdin); 
    } while (strlen(name)<1 || strlen(name)>10); 
    if(counter!=records) 
    { 
     fread(&data,sizeof(struct Player),1,ptr); 
     if(strcmp(data[i].name,name)==0) 
     { 

     } 
     counter++; 
    } 
    printf("\nScore and Level successfully updated.\n\n"); 
    printf("Press Enter to continue....\n\n"); 
    getchar(); 
} 

void addPlayerRecord(){ 
    int i=0; 
    do { 
     printf("Input player name[1..10]: "); 
     scanf("%[^\n]s", data[i].name); 
     fflush(stdin); 
    } while (strlen(data[i].name)<1 || strlen(data[i].name)>10); 
    fflush(stdin); 
    getchar(); 
    data[i].score=0; 
    data[i].level=0; 

    ptr = fopen("text.txt", "a"); 
    printf("\n"); 
    fprintf(ptr, "\r\n%s#%d#%d", data[i].name, data[i].score, data[i].level); 
    fclose(ptr); 

    printf("\nData successfully added.\n\n"); 
    printf("Press Enter to continue....\n\n"); 
    getchar(); 
} 


void viewPlayerRecord(){ 
    int i=0; 
    ptr = fopen("text.txt", "r"); 
    printf("Player Name\t\t|Average Score\t|Number of Playing\n"); 
    printf("=======================================================\n"); 
    while(fscanf(ptr, "%[^#]#%d#%d\n", data[i].name, &data[i].score, &data[i].level)!=EOF) 
    { 
     printf("%s\t\t\t|%d\t\t\t\t|%d\n", data[i].name, data[i].score, data[i].level); 
     i++; 
    } 
    fclose(ptr); 
} 

int main() { 
    int choice; 
    do{ 
     printf("Score Record Dota Player\n"); 
     printf("========================\n"); 
     printf("1. View Record\n"); 
     printf("2. Update Player Record\n"); 
     printf("3. Add New Player\n"); 
     printf("4. Delete Player\n"); 
     printf("5. Save and Exit\n\n"); 
     do { 
      printf("Input your choice[1..5]: "); 
      scanf("%d", &choice); 
      fflush(stdin); 
      getchar(); 
     } while (choice < 1 || choice > 5); 

     switch (choice) { 
      case 1: 
       viewPlayerRecord(); 
       break; 

      case 2: 
       updatePlayerRecord(); 
       break; 

      case 3: 
       addPlayerRecord(); 
       break; 

      case 4: 
       deletePlayerRecord(); 
       break; 
     } 
    } while(choice!=5); 
    return 0; 
} 
+0

코드 검토 요청이 잘못되었습니다. – maxpovver

+0

삭제 기능을 통해 도움을 요청하는 경우 문제에 대한 세부 정보를 제공하십시오. 다른 사람에게 당신을위한 업데이트 기능을 작성하도록 요청하는 경우 다른 곳을보십시오. –

+0

0)'fileSize'에서'fclose (ptr)'을 잊어 버렸습니다. – BLUEPIXY

답변

0

은 당신의 코드로 많은 문제가 있습니다

  • 모든 작업은 데이터베이스 파일에서 작동합니다. 이는 좋은 디자인 일 수 있지만 더 일반적인 방법은 데이터베이스를 시작할 때 메모리에로드하는 것입니다. 즉 data을 채우고 작업하십시오. 프로그램을 종료 할 때 모든 변경 사항을 데이터베이스 파일에 적용합니다. (옵션 5는 "저장하고 종료"라는 이름이지만 실제로는 null 연산입니다. 그 이름은 대략적인 접근법을 암시합니다.)

  • 데이터베이스가 바이너리 파일인지 또는 텍스트 파일인지 확인해야합니다 . 레코드를 추가하고 표시 할 때 텍스트 파일에 사용되는 fprintffscanf을 사용하지만 레코드를 업데이트 및 삭제할 때 이진 파일에 사용되는 fwritefread을 사용합니다. 제 생각에는 바이너리 액세스가 좀 더 쉽습니다. 고정 된 크기의 청크를 저장하고 검색해야하기 때문입니다. 즉 sizeof(struct Player)입니다. 텍스트 파일은 텍스트 편집기에서 표시 및 수정할 수 있기 때문에 사용자에게 더 친숙하지만 파싱해야하며보다 고급 오류 처리가 필요합니다.

  • fileSize()은 이진 파일에서만 작동하지만 현재는 텍스트 파일 만 작성합니다. 일반적으로 파일 함수의 반환 값을 사용하여 읽기 또는 쓰기가 성공했는지 확인하는 것이 좋습니다.

  • 데이터베이스 파일이 없으면보기 기능이 중단됩니다. 파일 존재 여부 및 올바른 형식을 확인하십시오.

  • 현재로서는 data을 스크래치 공간으로 만 사용합니다. data[i]에 액세스해야하지만 코드 전체에서 i은 0입니다.

    void deletePlayerRecord() 
    { 
        struct Player p; 
        char name[50]; 
        int del = 0; 
    
        ptr2 = fopen("text2.txt", "w"); 
        ptr = fopen("text.txt", "r"); 
    
        do { 
         printf("Input player name[1..10]: "); 
         scanf("%[^\n]s", name); 
         fflush(stdin); 
        } while (strlen(name)<1 || strlen(name)>10); 
    
        while (fscanf(ptr, "%[^#]#%d#%d\n", p.name, &p.score, &p.level) == 3) { 
         if(strcmp(p.name, name) == 0) { 
          printf("\n%s successfully deleted.\n\n", name); 
          del++; 
         } else { 
          fprintf(ptr2, "%s#%d#%d\n", p.name, p.score, p.level); 
         } 
        } 
        fclose(ptr); 
        fclose(ptr2); 
        remove("text.txt"); 
        rename("text2.txt", "text.txt");  
    
        printf("%d character(s) deleted\n\n", del); 
    } 
    

    이 코드는 여전히이 많은 단점 : fopen의 성공을 선택하지

    은 작동 삭제 기능을 수정했습니다.

  • fscanffprintf 형식은보기에서 그대로 복사하여 레코드 옵션을 추가해야합니다. 그건 나쁜 스타일이야. 아마도 readPlayerwritePlayer 함수를 작성해야합니다.

  • 입력 코드도 마찬가지입니다.전체 코드를 반복해서 반복 할 필요가 없도록 오류 검사를 수행하는 프론트 엔드 함수를 작성하십시오. 이로 인해 코드가 읽기 어려워지며 오류가 발생하기 쉽습니다.

관련 문제