Ошибки в C Switch Menu, использующие Char в качестве выбора, не читаются в имени fgets - PullRequest
0 голосов
/ 21 ноября 2019

Я в основном пишу программу, которая создает, читает, обновляет и удаляет записи в двоичном файле.

Все компилируется правильно, нет синтаксических ошибок, но у меня есть некоторые ошибки.

ИЗВЕСТНЫЕ БАГИ

1.)Вменение каких-либо строк не работает, используя fgets

2.) Ctrl-D работает, но выдает ошибку «по умолчанию» до ее выхода.

3.) Обновление не работает (не моеосновной вопрос на данный момент, так как остальные сейчас более важны.)

4?) Я не уверен, работает ли меню так, как оно должно работать. Я думаю, что делать, пока правильно, так как в меню, если я выбираю и нажимаю CTRL-D, он выходит из программы. Просто хочу быть уверенным.

Прямо сейчас я просто хочу знать, почему, он пропускает имя_курса в функции входов.

Вот мой код до сих пор

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>    
#include <sys/stat.h>
#include <errno.h>
#include <string.h>

typedef  struct{
char  courseName [64];
char  courseSched [4];
unsigned  int  courseHours;
unsigned  int  courseSize;} COURSE;

FILE *pfileCourse;
int courseNumber = 0;

//Prototypes

void inputDetails(COURSE *c);
void readCourseRecord();
void createCourseRecord();
void print_menu();
void modifyCourseInfo();
void deleteCourse();
void display(COURSE c);


/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {

char choice;    // this is the choice
printf("Enter one of the following actions or press CTRL-D to exit\n");
printf("C - Create a new course record\n");
printf("R - Read an existing course record\n");
printf("U - Update an existing course record\n");
printf("D - Delete an existing course record\n");

do{
    choice = getchar();
    switch(choice) {
        case 'c':
        case 'C':
        printf("YOU PICKED C for Create\n");
        createCourseRecord();
        break;
        case 'r':
        case 'R':
        printf("This is Choice R\n");
        readCourseRecord();
        break;
        case 'u':
        case 'U':
        printf("Here is where you update an existing course\n");
        modifyCourseInfo();
        break;
        case 'd':
        case 'D':
        printf("here is where you Delete an existing course record\n");
        deleteCourse();
        break;
        default:
        printf("Wrong Choice!\n");
} 

}while(choice != EOF);
return 0;
}

void createCourseRecord() {
COURSE data;
pfileCourse = fopen("courses.dat", "ab");
printf("Please Enter The Details of The Course\n");
inputDetails(&data);
fwrite(&data, sizeof(data), 1, pfileCourse);
fclose(pfileCourse);
printf("Course Has Been Created!\n");
}


void inputDetails(COURSE *c) {

printf("Enter a course number: \n");
scanf("%d", &courseNumber);

printf("Enter a Course Name: \n");
fgets(c->courseName, sizeof(courseName), stdin);

printf("Enter the course schedule (MWF or TR): \n");
fgets(c->courseSched, 4, stdin);
fflush(stdin);

printf("Enter the course credit hours: \n");
scanf("%d",&c->courseHours);
fflush(stdin);

printf("Enter Number of Students Enrolled: \n");
scanf("%d",&c->courseSize);
return;
}

void readCourseRecord(){
COURSE data;
int flag = 0;
int readCourseNumber = 0;
printf("Please Enter a Course Number to Display\n");
scanf("%d", &readCourseNumber);
fflush(stdin);

pfileCourse = fopen("courses.dat", "rb");
while((fread(&data, sizeof(data), 1, pfileCourse)) > 0) {
    if(readCourseNumber == courseNumber)
    {
        display(data);
        flag = 1;
    }
}
fclose(pfileCourse);
if(flag == 0)
    printf("Course not Found!\n");
}

void deleteCourse(){
int newCourseNum;
COURSE data;
FILE *file2;

printf("Please Enter The Course You Wish You Delete\n");
scanf("%d", &newCourseNum);
pfileCourse = fopen("courses.dat", "rb");
file2 = fopen("temp.dat", "wb");
rewind(pfileCourse);
while((fread(&data, sizeof(data), 1, pfileCourse)) > 0)
{
    if(courseNumber != newCourseNum)
    {
        fwrite(&data, sizeof(data), 1, file2);
    }
}
fclose(file2);
fclose(pfileCourse);
remove("courses.dat");
rename("temp.dat", "courses.dat");
printf("%d was Successfully deleted\n", newCourseNum);
}

void modifyCourseInfo()
{
COURSE data;
int newCourseNum, found = 0;

printf("Modify\n");
printf("Please Enter The Course You Wish You Modify\n");
scanf("%d", &newCourseNum);

pfileCourse = fopen("courses.dat", "rb+");
while ((fread(&data, sizeof(data), 1, pfileCourse)) > 0 && found == 0)
{
    if (courseNumber == newCourseNum)
    {
        display(data);
        printf("Please Enter New Details\n");
        inputDetails(&data);
        fseek(pfileCourse, - (long)sizeof(data), 1);
        fwrite(&data, sizeof(data), 1, pfileCourse);
        printf("Course Updated\n");
        found == 1;

    }
}
fclose(pfileCourse);
if(found == 0)
        printf("ERROR: course not found\n");
}

void display(COURSE c){
printf("courseNumber:\t %d\n", courseNumber);
printf("courseName:\t %s\n",c.courseName);
printf("courseSched:\t %s\n",c.courseSched);
printf("courseName:\t %d\n",c.courseHours);
printf("courseSize:\t %d\n",c.courseSize);
}

1 Ответ

2 голосов
/ 21 ноября 2019

Он не пропускает courseName, courseName просто получает значение '\ n', потому что функция scanf прекращает чтение вашего ввода ДО пустого пространства. Scanf игнорирует любые пробельные символы, встречающиеся перед следующим непробельным символом. Таким образом, вы можете просто добавить

scanf("%d[^\n]", &courseNumber);
getchar();

после каждого сканирования, но я рекомендую вам использовать функцию fgets для каждого интерактивного ввода.

...