Member 14081431 Ответов: 2

Как сохранить данные в файле на языке C


Я работаю над этим проектом бронирования кинотеатров !! 2 проблемы, с которыми я сталкиваюсь здесь, связаны с сохранением данных.

1) : Когда я закрываю программу и пытаюсь зарегистрировать нового пользователя, регистрационная информация предыдущего зарегистрированного пользователя удаляется, даже если я открываю файл в режиме "а+". но если я напрямую войду в систему с уже зарегистрированным пользователем, это сработает. дело в том, что я не могу зарегистрировать более 1 пользователя одновременно.

2) : Когда я закрываю программу и снова вошел в систему, информация о резервировании пользователя удаляется. я также хочу сохранить информацию о бронировании пользователя.

Как я могу решить эту проблему ?

Что я уже пробовал:

struct login
    {
        char fname[100];
        char lname[100];
        char username[20];
        char password[20];
    };
    #include <stdio.h>
    #define RVALUE 5
    #define CVALUE 10
    int i, j;
    void DisplaySeats(void);
    void ReserveSeats(void);
    void ChooseSeat(void);
    void CancelSeat(void);
    void CheckCancelSeat(void);
    void menu(void);
    int Seats[RVALUE][CVALUE];

    void registration();
    void login();
    int main()
    {
        int c;
        int choice, menu;
        printf("Welcome to our small Cinema!!!\n");
        printf("\n");
        //DisplaySeats();
        printf("\n1 : register!!!\n");
        printf("2 : login!!!\n");
        printf("3 : quit\n");
        printf("Enter your choice : \n");
        scanf("%d",&c);
        switch (c)
        {
        case 1:
            registration();
            break;
        case 2:
            login();
            break;
        case 3:
            printf("Thankyou for Choosing our small Cinema !! \n");
            getch();
            exit(1);
        default :
            system("CLS");
            printf("Enter a valid number !!\n");
            main();
        }

        getch();

    }
    void registration()
    {
        FILE *log;
        log = fopen("login.txt", "a+");
        struct login l;
        printf("\nEnter first name : ");
        scanf("%s", &l.fname);
        printf("\nEnter last name : ");
        scanf("%s", &l.lname);
        printf("\nEnter your Username : ");
        scanf("%s", &l.username);
        printf("\nEnter your password : ");
        scanf("%s", &l.password);
        fwrite(&l, sizeof(l), 1, log);
        fclose(log);
        printf("\nYou are successfully registered!!");
        printf("\nYour UserId is %s and your password is %s", l.username, l.password);
        printf("\nNow login with your username and password!!");
        printf("\nPress any key to continue ...");
        getch();
        system("CLS");
        main();
    }
    void login()
    {
        char username[100];
        char password[100];
        FILE *log;
        struct login l;
        log = fopen("login.txt", "r");
        if (log == NULL)
        {
            printf("FILE NOT FOUND!!!");
            exit(1);
        }
        printf("\nUserID : ");
        scanf("%s", &username);
        printf("\nPassword : ");
        scanf("%s", &password);
        while (fread(&l, sizeof(l), 1, log));
        {
            if (strcmp(username, l.username) == 0 && strcmp(password, l.password)==0)
            {
                system("CLS");
                printf("\nYou are successfully logged in !!\n");
                menu();

            }



            else
            {
                    printf("\nYour UserID or password is incorrect !!\n");
                    printf("Press any key to continue ...\n");
                    getch();
                    system("CLS");
                    login();
            }


        }
        fclose(log);

    }
    void ChooseSeat(void)
    {

        int row, col,k;
        printf("Which row do you want to choose? : ");
        scanf("%d", &row);
        printf("Which seat do you want to select? : ");
        scanf("%d", &col);
        if (row > RVALUE || col > CVALUE)
        {
            printf("Wrong Entry !! Try again\n");
            ChooseSeat();
        }
        else if (Seats[row - 1][col - 1] != 0)
        {
            printf("Seat is already reserved try again !!\n");
            ChooseSeat();
        }
        else
        {
            Seats[row - 1][col - 1] = 1;
            printf("Congratulations!! Reservation Completed!!!\n");
            DisplaySeats();
            printf("\nPress any key to go to main menu!!");
            getch();
            system("CLS");
            main();
        }


    }

    void ReserveSeats(void)
    {
        int NoOfSeats,i;
        printf("How many seats do you want to reserve?\n");
        scanf("%d", &NoOfSeats);
        DisplaySeats();
        for (i = 1; i <= NoOfSeats; i++)
        {
            ChooseSeat();
        }


    }
    void DisplaySeats(void)
    {
        printf("\t \t Seats\n");
        printf("\t 1 2 3 4 5 6 7 8 9 10\n");

        for (i = 0; i < RVALUE; i++)
        {
            printf("Rows %d : ", i + 1);
            for (j = 0; j < CVALUE; j++)
                printf("%d ", Seats[i][j]);
            printf("\n");
        }
        printf("\n");

    }
    void CheckCancelSeat(void)
    {
        while (1)
        {
            for (i = 0; i < RVALUE; i++)
            {
                for (j = 0; j < CVALUE; j++)
                {
                    if (Seats[i][j] == 0)
                    {
                        printf("There is no reserved seat available!!\n");
                        break;
                    }
                    else
                    {
                        CancelSeat();
                    }
                    break;
                }
                break;
            }
            system("CLS");
            break;


        }
    }
    void CancelSeat(void)
    {
        int r, c;
        printf("\nWhich row do you want to cancell ? : ");
        scanf("%d", &r);
        printf("\nWhich column do you want to cancell ? : \n");
        scanf("%d", &c);

        if (Seats[r - 1][c - 1] != 0)
        {
            Seats[r - 1][c - 1] = 0;
            printf("Your Seat is Cancelled !!\n");
            system("CLS");
        }
        else
        {
            printf("Wrong Entry !!\n");
            CancelSeat();
        }
    }
    void menu(void)
    {
        int choice;
            DisplaySeats();

            printf("1 : reserve a seat\n");
            printf("2 : cancell a seat\n");
            printf("3 : Main Menu\n");
            printf("Enter your choice : \n");
            scanf("%d", &choice);
            system("CLS");
            switch (choice)
                {
                    case 1:
                        ReserveSeats();
                        break;
                    case 2:
                        CheckCancelSeat();
                        break;

                    case 3:
                        main();
                        break;
                    default:
                        printf("Please enter a valid choice!!");
                        menu();
                        break;
                }
    }

KarstenK

используйте цикл while в своей основной функции, чтобы избежать рекурсивного вызова.

2 Ответов

Рейтинг:
1

CPallini

Ваша программа плохо организована, с бесполезными вредными рекурсивными вызовами, вызовами к main, глобальная переменная.
Для того чтобы получить надлежащую помощь вы должны показать нам код main функция.

[обновление]
Попробуйте следующую программу (обратите внимание, что вы всегда должны проверять возвращаемое значение scanf функция, я показал только некоторые примеры в опубликованном коде)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ROWS 5
#define COLS 10

#define LONG_STRING 100
#define SHORT_STRING  20

struct Login
{
  char fname[LONG_STRING];
  char lname[LONG_STRING];
  char username[SHORT_STRING];
  char password[SHORT_STRING];
};

void displaySeats(int seats[ROWS][COLS]);
void reserveSeats(int seats[ROWS][COLS]);
void cancelSeat(int seats[ROWS][COLS]);

int handleMainMenu();
int handleSubMenu(int seats[ROWS][COLS]);
void registration();
int login();


enum
{
  LOGGED_OUT,
  LOGGED_IN,
  EXIT
};

int main()
{
  int user_state = LOGGED_OUT;

  int seat[ROWS][COLS] = {0};

  while  (user_state != EXIT)
  {
    if ( user_state == LOGGED_OUT)
    {// user is NOT logged in, handle main menu 
      user_state = handleMainMenu();
    }
    else
    {// user is logged in, handle sub menu
      user_state = handleSubMenu(seat);
    }
  }
  return 0;
}

int handleMainMenu()
{
  int choice;
  while ( 1 )
  {
    printf("Welcome to our small Cinema!!!\n");
    printf("\n");
    printf("\n1 : register!!!\n");
    printf("2 : login!!!\n");
    printf("3 : quit\n");
    printf("Enter your choice : \n");

    if ( scanf("%d", &choice) == 1)
    {
      switch ( choice)
      {
      case 1:
        registration();
        break;
      case 2:
        if ( login())
          return LOGGED_IN;
        break;
      case 3:
        printf("Thank you for choosing our small Cinema !! \n");
        return EXIT;
      default:
        printf("Invalid choice, please insert a valid number\n");
        break;
      }
    }
  }
} 

int handleSubMenu(int seat[ROWS][COLS])
{
  int choice;

  while ( 1 )
  {
    printf("\nReservation Menu\n");
    displaySeats(seat);

    printf("1 : reserve a seat\n");
    printf("2 : cancell a seat\n");
    printf("3 : Main Menu\n");
    printf("Enter your choice : \n");
    if (scanf("%d", &choice)==1)
    {
      switch (choice)
      {
      case 1:
        reserveSeats(seat);
        break;
      case 2:
        cancelSeat(seat);
        break;
      case 3:
        return LOGGED_OUT;
      default:
        printf("Please enter a valid choice!!");
        break;
      }
    }
  }
}

void registration()
{
  FILE *log = fopen("login.txt", "a+");
  struct Login l;
  printf("\nEnter first name : ");
  scanf("%s", (l.fname));
  printf("\nEnter last name : ");
  scanf("%s", l.lname);
  printf("\nEnter your Username : ");
  scanf("%s", l.username);
  printf("\nEnter your password : ");
  scanf("%s", l.password);
  fwrite(&l, sizeof(l), 1, log);
  fclose(log);
  printf("\nYou are successfully registered!!");
  printf("\nYour UserId is %s and your password is %s", l.username, l.password);
  printf("\nNow login with your username and password!!");
  printf("\nPress any key to continue ...");
  getchar();
}

int login()
{
  FILE *log;
  struct Login linput, lfile;
  log = fopen("login.txt", "r");
  if (log == NULL)
  {
    printf("FILE NOT FOUND!!!\n");
    return 0; // login failed
  }
  printf("\nUserID : ");
  scanf("%s", linput.username);
  printf("\nPassword : ");
  scanf("%s", linput.password);
  while ( fread(&lfile, sizeof(lfile), 1, log)  )
  {
    if (strcmp(linput.username, lfile.username) == 0
      && strcmp(linput.password, lfile.password)==0)
    {
      printf("\nYou are successfully logged in !!\n");
      fclose(log);
      return 1; // login succeeded
    }
  }
  printf("\nYour UserID or password is incorrect !!\n");
  printf("Press any key to continue ...\n");
  getchar();
  fclose(log);
  return 0; // login failed
}

void reserveSeats(int seat[ROWS][COLS])
{
  int noOfSeats, noOfReservedSeats;
  printf("How many seats do you want to reserve?\n");
  scanf("%d", &noOfSeats);
  displaySeats(seat);

  noOfReservedSeats = 0;

  while (noOfReservedSeats < noOfSeats)
  {
    int row, col;

    printf("Which row do you want to choose? : ");
    scanf("%d", &row);
    printf("Which seat do you want to select? : ");
    scanf("%d", &col);
    if (row > ROWS || col > COLS)
    {
      printf("Wrong Entry !! Try again\n");
    }
    else if (seat[row - 1][col - 1] != 0)
    {
      printf("Seat is already reserved try again !!\n");
    }
    else
    {
      seat[row - 1][col - 1] = 1;
      ++noOfReservedSeats;
    }
  }
  printf("Congratulations!! Rservation complete!!!\n");
  printf("\nPress any key to continue!!\n");
  getchar();
}

void displaySeats(int seat[ROWS][COLS])
{
  printf("        Seats\n");
  printf("        1 2 3 4 5 6 7 8 9 10\n");
  int row;
  for (row = 0; row < ROWS; ++row)
  {
    int col;
    printf("Row %d : ", row + 1);
    for (col = 0; col < COLS; ++col)
      printf("%d ", seat[row][col]);
    printf("\n");
  }
  printf("\n");
}

void cancelSeat(int seat[ROWS][COLS])
{
  displaySeats(seat);
  int row, col;
  printf("\nWhich row do you want to cancell ? : ");
  scanf("%d", &row);
  printf("\nWhich column do you want to cancell ? : \n");
  scanf("%d", &col);

  if (seat[row - 1][col - 1] != 0)
  {
    seat[row - 1][col - 1] = 0;
    printf("Your Seat is Cancelled !!\n");
  }
  else
  {
    printf("The seat was not reserved !!\n");
  }
}

[/обновление]


Member 14081431

@Cpallini я изменил полный код, который я пробовал до сих пор

CPallini

Взгляните на мое обновленное решение.

Рейтинг:
1

OriginalGriff

Как всегда, начните с отладчика. Откройте файл входа в систему в хорошем редакторе (не блокноте), который "смотрит" на файл и замечает изменения. Я использую PSPad, но есть множество других. Вы хотите открыть файл в редакторе, а затем, когда другое приложение изменит его, редактор должен заметить и спросить, хотите ли вы перезагрузить его. (Блокнот этого не делает, но вы можете использовать его для проверки того, что делают другие)

Затем запустите код в отладчике. Зарегистрируйте нового пользователя. Изменился ли файл? Если это не так, то что-то смотрит не на тот файл. Выясните, что именно.
Если это так, то закройте свое приложение. Меняется ли она обратно?
Копируйте свое приложение снова. Изменился ли файл?

В принципе, вы хотите знать, когда файл изменяется, и когда, если изменяется обратно, если это происходит. Затем вы можете использовать отладчик, чтобы узнать, что делает ваш код, и выяснить, что его изменяет (или нет) и почему. Но без этой информации? никто не знает!

Кстати: зачем ты звонишь main от вашего имени registration и ChooseSeat функции? Это действительно не очень хорошая идея, она вызовет переполнение стека, если вы сделаете это ото много раз. Вместо этого вы должны смотреть на петли.


Member 14081431

я не публиковал весь код и использую кодовые блоки а не Блокнот