2013-08-04 2 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; 

В этой программе я пытаюсь записать записи в файл с именем 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 < "Enter"> -> ничего

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