2013-08-04 103 views
1
int main() 
{ 

    FILE *fp; 
    char another = 'Y'; 
    struct emp 
    { 
      char name[20]; 
      int age; 
      float bs; 
    }; 
    struct emp e; 

    fp = fopen("employee.dat", "w"); 

    if(fp == NULL) 
    { 
      printf("file cannot be opened for writing\n"); 
      exit(1); 
    } 

    while(another == 'Y') 
    { 
      printf("\n enter name, age and basic salary: "); 
      scanf("%s %d %f", e.name, &e.age, &e.bs); 
      fprintf(fp, "%s %d %f\n", e.name, e.age, e.bs); 

      printf(" Add another record (Y/N)"); 
      fflush(stdin); 
      scanf("%c", &another); 
    } 

    fclose(fp); 
    return 0; 

在這個程序中,我試圖將記錄寫入文件named,employee.dat。程序執行得很好,但只需要一條員工記錄,然後程序終止。它不要求下一條記錄添加,即,將記錄寫入文件:c

fflush(stdin); 
scanf("%c", &another); 

沒有在程序中執行。

在此先感謝....

回答

1

的問題,你遇到的是隻scanf("%c", &another);抓住從輸入緩衝器中的單個字符。這很好,除了輸入緩衝區中還有一個換行符因輸入後點擊'enter'而產生。你需要清空輸入緩衝區使用getchar()後是這樣的:

char c; 
while ((c = getchar()) != '\n'); 
+0

沒有必要! noly使用flushall(); scanf後 –

+0

@OneManCrew你是什麼意思「不需要」?這是另一種方式,與您的一樣好。 –

1

你可以這樣做:

while(another == 'Y' || another == 'y') 
    { 
      printf("\n enter name, age and basic salary: "); 
      scanf("%s %d %f", e.name, &e.age, &e.bs); 
      fprintf(fp, "%s %d %f\n", e.name, e.age, e.bs); 

      printf(" Add another record (Y/N)"); 

      another=getch(); 
      //scanf("%c", &another); 

    } 
+0

'flushall'不是一個標準功能。在任何情況下,嘗試刷新輸入流都是未定義的行爲。 – interjay

0

你可以簡單地通過使用固定它:而不是scanf("\n%c",&another);scanf("%c",&another);

scanf("%s %d %f", e.name, &e.age, &e.bs); 

示例--->這裏輸入的內容是:name_1 22 6000.000 <「Enter」>

然後在緩衝區:NAME_1 - > e.name 22 - > e.age 6000.00 - > e.bs < 「輸入」> - >沒什麼

fflush(stdin);//it didn't delete the <"Enter">. 
scanf("\n%c", &another);//here we deal with <"Enter">