2012-12-27 4 views
0
#include <stdio.h> 
#include <stdlib.h> //for the clear screen function 
#include <string.h> 

struct customer 
{ 
    int custID; 
    char custName[50]; 
    char custAddress[100]; 
}; 

typedef struct customer c; 

void load_menu(void); 
void customers_menu(void); 
void createNew(void); //initialize your file 
void add_Customer(c c1[30]); //add a new record to the file 
FILE *fp; 



int main(void) 
{ 

load_menu(); 
return 0; 
} 

void load_menu(void) 
{ 
int choice; 

do 
{ 
    printf("Customer Orders Main Menu. \n\n"); 
      printf("Please enter your choice: \n"); 
    printf("1. Customer's Menu \n"); 
    printf("2. Orders Menu\n"); 
    printf("3. Product Stock Menu\n"); 
    printf("4. Exit\n"); 
    printf("\n"); 
    if (scanf("%d",&choice)==1) 
    { 

     switch(choice) 
     { 
      case 1: system ("cls"); 
        customers_menu(); 
        printf("\n"); 
        break; 
      case 2: system ("cls"); 
        orders_menu(); 
        printf("\n"); 
        break; 
      case 3: system ("cls"); 
        stock_menu(); 
        printf("\n"); 
        break; 
      case 4: printf("Quitting program!\n"); 
        break; 
      default: printf("Invalid choice! Please try again\n"); 
        printf("\n"); 
       break; 
     } 
    } 

    else 
    { 
     fflush(stdin); 
     printf("Characters are invalid, please enter a number: \n "); 
     choice=0; 
    } 

}while((choice !=4)); 
} 




void createNew(void) 
{ 
    FILE *fp; 
    fp=fopen("Customer.dat", "w"); 
    if (fp==NULL) 
     printf("File creation failed! \n"); 
    else 
    { 
     printf("File created! \n"); 
     fclose(fp); 
    } 

} 

void add_Customer (c c1[30]) 
{ 
    int i, n , cc=0; 
    FILE *fp; 
    fp=fopen("Customer.dat", "a"); 
    system("cls"); 

    if(fp==NULL) 
    { 
     printf("File Creation Failed!"); 
    } 
    system("cls"); 

    printf("Enter the number of Customers: "); 
    scanf("%d", &n); 

    for(i=0;i<n;i++) 
    { 
     printf("Customer's ID (numbers only) : "); 
     scanf("%d", &c1[i].custID); 

     printf("Customer's Name    : "); 
     gets(c1[i].custName); 

     printf("Customer's Address   : "); 
     gets(c1[i].custAddress); 



     fwrite(&c1[i], sizeof(c), 1, fp); 
    }cc++; 

    fclose(fp); 
} 

void recordCount(c c1[30], int *count) 
{ 
    add_Customer(c1); 
    count=0; 
    count++; 
} 

void customers_menu(void) 
{ 
int choice; 
    c c1[30]; 
    int i; 


do 
{ 
    printf("\n"); 
    printf("Customers Menu \n\n"); 
    printf("Please enter your choice: \n"); 
    printf("1. Add Customer \n"); 
    printf("2.\n"); 
    printf("3.\n"); 
    printf("4. Go back to Main Menu \n"); 
    recordCount (c1, &i); 

    if (scanf("%d",&choice)==1) 
    { 

     switch(choice) 
     { 
      case 1: add_Customer(c1); 
        createNew(); 

        printf("\n"); 
        break; 
      case 2: 
        printf("\n"); 
        break; 
      case 3: 
        printf("\n"); 
        break; 
      case 4: printf("Going back to Main Menu\n"); 
        system ("cls"); 
        break; 
      default: printf("Invalid choice! Please try again\n"); 
        printf("\n"); 
       break; 
     } 
    } 

    else 
    { 
     fflush(stdin); 
     printf("Characters are invalid, please enter a number: \n "); 
     choice=0; 
    } 

}while((choice !=4)); 

Customers 메뉴를 입력하면 문제 1이 즉시 실행됩니다 (여전히 올바르게 작동하지 않음). 누군가가 내가 알고있는 모든 노력을 나 때문에이 오류 좀 해결하고 헛된메뉴가 제대로 작동하지 않습니다.

+0

문제에 대한 설명을 완전히 이해하고 있는지 잘 모르겠습니다. 귀하의 스위치 진술은 괜찮아 보입니다. 어떤 입력이 잘못된 행동을 일으키는가? – StoryTeller

+0

온전한 체크 : if 블럭 안쪽에 실제로 읽혀지는 것을보기 위해'printf ("% d", choice);를 넣으십시오. – slugonamission

+0

아마도 그렇지 않습니다. 'customers_menu'에서'add_Customer'를 호출하는'recordCount'를 호출합니다. 또한 앞의'scanf' 호출의 새로운 라인이 여전히 입력 버퍼에 있기 때문에 첫 번째'gets' 호출이 즉시 리턴된다는 것을 명심하십시오. – netcoder

답변

1

나는 당신의 문제가 customers_menu()을 출력 메뉴 만에 선택을 읽지 않는 것을 생각 반환합니다.

addCustomer() 다음에 우리는 customers_menu()을 반환하고, 그 후에 길게 사라진 메뉴에 대해 scanf()을 호출합니다.

다른 몇 가지주의 사항 :

  1. gets()이 좋지 않아, 난 당신이 대신 (% s 님과 함께) scanf() 사용하는 것이 좋습니다.
  2. printf()을 수행하면 화면이 지워집니다.
  3. 오류 메시지는 stdout (printf (...)) 대신 stderr (fprintf (stderr, ...))로 이동해야합니다.
  4. 코드가 누락되었습니다}.
  5. cc가 추가되었지만 사용되지는 않습니다.
+0

나는 이것을 통해 customer_menu에서 선택 사항을 읽습니다 : if (scanf ("% d", & choice) == 1 – user1930901

+0

예,하지만 * after * you 'recordCount()'를 호출하십시오. – cdarke

1

아직 선택을 반환하지 않습니다 if (scanf("%d",&choice)==1)scanf 때문에서 오는이 문제입니다 도움이 될 수 있습니다. 숫자와 같은 유효한 대답을 입력하면 1을 반환하고 1로 전환합니다. 문제라고 생각합니다. 대신 정수의 문자를 입력하면 , scanf 대신 직접 addCustomer()를 호출 recordCount() 전화, 0

+3

'scanf()'는 stdin에서 일치시킬 수있는 arg의 수를 반환합니다. 그것은'getchar()'와 같은 방식으로 입력 자체를 반환하지 않습니다. 이 경우 모든 것이 정상이라고 가정하고 항상'1'을 반환해야합니다. –

+0

정확하게 문제의 원인이 아닌 것 같습니다 ... – user1930901

관련 문제