Я подозреваю, что моя программа не работает должным образом. Результат не такой, как я ожидал. Когда я запускаю эту программу в первый раз, результат будет другим, чем если бы мы повторили действие, не закрывая программу, например, добавили новую запись ..
Вот исходный код, который у меня есть на данный момент:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
struct emp{
char name[40];
int age;
float bs;
};
main()
{
FILE *fp, *ft;
struct emp e;
char choice;
char another;
char empname[40];
fp = fopen("emp.dat","rb+");
if (fp == NULL)
{
fp = fopen("emp.dat", "wb+");
if (fp == NULL)
{
printf("File cannot be opened\n");
system("pause");
exit(0);
}
}
while(1)
{
system("cls");
printf("1. Add New Record\n");
printf("2. Modify to Record\n");
printf("3. Delete to Record\n");
printf("4. Display Records\n");
printf("0. Exit\n");
printf("Enter your choice: \n");
fflush(stdin);
choice = getche();
printf("\n");
switch(choice)
{
case '1':
another = 'Y';
fseek(fp,0,SEEK_END);
while(another == 'Y')
{
printf("Enter name, age and basic salary: \n");
scanf("%s%d%f", e.name, &e.age, &e.bs);
fwrite(&e,sizeof(e),1,fp);
printf("Add more records (Y/N)\n");
fflush(stdin);
scanf("%c", &another);
}
break;
case '2':
printf("Enter name of employee to modify record!\n");
scanf("%s", empname);
rewind(fp);
while(fread(&e,sizeof(e),1,fp) == 1)
{
while(strcmp(e.name,empname) == 0)
{
fseek(fp,-1,SEEK_CUR);
printf("Enter new name, age, basic salary!\n");
scanf("%s %d %f", e.name, &e.age, &e.bs);
fwrite(&e,sizeof(e),1,fp);
}
}
break;
case '3':
another = 'Y';
while(another == 'Y')
{
rewind(fp);
ft = fopen("temp.dat", "wb+");
printf("Enter name of employee to delete record!\n");
scanf("%s", &empname);
while(fread(&e,sizeof(e),1,fp) == 1)
{
while(strcmp(e.name,empname) != 0)
{
fseek(fp,-1,SEEK_CUR);
fwrite(&e,sizeof(e),1,ft);
}
fclose(fp);
fclose(ft);
remove("emp.dat");
rename("temp.dat","emp.dat");
fp = fopen("emp.dat","wb+");
}
printf("Do you want to delete more record/s (Y/N)!\n");
fflush(stdin);
another = getche();
}
break;
case '4':
rewind(fp);
while(fread(&e, sizeof(e), 1, fp) == 1)
printf("%s %d %0.2f\n", e.name, e.age, e.bs);
break;
case '0':
exit(0);
break;
default:
printf("Enter correct choice!\n");
break;
}
fclose(fp);
system("pause");
}
}
Вот моя запущенная программа и пример вывода:

Возникает ли нежелательный результат только в определенных ситуациях? Например. для какого входа? Нужен ли весь показанный код для демонстрации нежелательного поведения? Если нет, пожалуйста, сосредоточьтесь. Т.е. сделайте минимальный воспроизводимый пример.
Можете ли вы написать более точное название пункта? С текущим вы рискуете быть проигнорированным. Можете ли вы сосредоточиться на том, что кажется неправильным, вместо того, чтобы это выглядело неожиданным?
Например, добавьте записи, а затем выберите вариант 4. Он должен отобразить все записи. Но ничего не отображается. Вы можете видеть на прикрепленной картинке. Ничего не отображается. Далее, если вы попытаетесь модифицировать запись. Он просит ввести новое имя, возраст и bs. Но затем он продолжает спрашивать снова и снова, когда вы даже вошли. Думаю, если вы выполните этот код и попытаетесь использовать все 5 модулей. Вы узнаете проблемы.
@Yunnosch, а вы проверяли код?
Извините, я не понял ваш последний комментарий. Не могли бы вы перефразировать?
@Yunnosch Я пытаюсь еще раз объяснить. Это программа для переключателей. Существуют случаи, например, 1 для добавления новой записи, CASE 2 для изменения записи, CASE 3 для удаления записи и 4 для отображения списка записей. Теперь сначала я перехожу к первому СЛУЧАЮ 1 и добавляю туда записи. Теперь я хотел вывести на экран весь список этих записей. Я перехожу к СЛУЧАЮ 4. Потому что в СЛУЧАЕ 4 есть код для отображения всех этих записей. Он должен отображать все записи, когда я перехожу в СЛУЧАЙ 4. Но он ничего не отображает. Что там не так в коде? Вы поняли мою точку зрения?
Пожалуйста, редактировать ваш вопрос, чтобы добавить дополнительную информацию и подробности, вместо того, чтобы скрывать их в комментарии.
Если результат CASE 1 и 4 вызывает сомнения, сосредоточьтесь на одном из них. Можете ли вы продемонстрировать, что случай 4 позволяет выводить жестко закодированный контент? Можете ли вы использовать отладчик, чтобы убедиться, что случай 1 обеспечивает правильное сохранение? Постарайтесь найти проблему в одном случае, а не в комбинации, а затем упростите проблему, проанализировав и продемонстрировав эту проблему в одном случае. Вы также можете задать вопрос по проблеме только в одном случае. Убедитесь, что один футляр является пуленепробиваемым, затем переходите к следующему. Рекомендую сначала довести результат до совершенства, он может стать частью ваших инструментов.





Результат не такой, как вы ожидаете, но вы не показываете то, что ожидаете (просто напишите ожидаемый результат вручную), сделайте это. Также объясните, чего вы ожидаете. Также объясните, какова цель программы, почему желаемый результат соответствует вашим ожиданиям, есть ли логика? Кратко опишите цель программы. Все это вы должны объяснить и прояснить вам, а не догадываться читателям.