2014-04-23 212 views
0

我在學生管理系統的C++中有這個程序,除了一個地方,我嘗試根據他的編號刪除一個學生,一切工作正常。 它應該做的:問卷數後搜索記錄,並刪除它 這是什麼做的:它刪除所有不匹配的卷號學生管理系統C++

這裏的其他記錄是我的代碼:

#include <iostream> 

    #include <cstdio> 

    #include <cstring> 

    #include <cstdlib> 

    #include <conio.h> 

    #include <iomanip> 



using namespace std; 
int main() { 

    FILE *fp, *ft; 

    char another, choice; 



struct student { 

     char first_name[50], last_name[50]; 
     int roll_num; //new code added 
     char course[100]; 
     int section; 
    }; 

    struct student e; 
    char xfirst_name[50], xlast_name[50]; 
    int xroll_num ; // new code added 
    long int recsize; 

    fp=fopen("users.txt","rb+"); 

    if (fp == NULL) { 
     fp = fopen("users.txt","wb+"); 

     if (fp==NULL) 
     { 
      puts("Cannot open file"); 
      return 0; 
     } 
    } 


recsize = sizeof(e); 

while(1) { 
    system("cls"); 

    cout << "\t\t====== STUDENT INFORMATION SYSTEM ======"; 
    cout <<"\n\n           "; 
    cout << "\n\n"; 
    cout<<" \n\t\t\t======================"; 
    cout << "\n \t\t\t 1. Add Records"; 
    cout << "\n \t\t\t 2. List Records"; 
    cout << "\n \t\t\t 3. Modify Records"; 
    cout << "\n \t\t\t 4. Delete Records"; 
    cout << "\n \t\t\t 5. Exit Program"; 
    cout<<" \n\t\t\t======================"; 
    cout << "\n\n"; 
    cout << "\t\t\t Select Your Choice ::"; 
    fflush(stdin); 
    choice = _getche(); 
    switch(choice) 
    { 
     case '1' : 
      fseek(fp,0,SEEK_END); 
      another ='Y'; 
      while(another == 'Y' || another == 'y') 
      { 
        system("cls"); 
       cout << "Enter the First Name : "; 
       cin >> e.first_name; 
       cout << "Enter the Last Name : "; 
       cin >> e.last_name; 
       cout << "Enter the Course : "; 
       cin >> e.course; 
       cout << "Enter the Section : "; 
       cin >> e.section; 
       cout << "Enter the roll number :"; 
       cin >> e.roll_num; 
       fwrite(&e,recsize,1,fp); 
       cout << "\n Add Another Record (Y/N) "; 
       fflush(stdin); 
       another = getchar(); 
      } 
      break; 
     case '2': 
      system("cls"); 
      rewind(fp); 
      cout << "=== View the Records in the Database ==="; 
      cout << "\n"; 
      while (fread(&e,recsize,1,fp) == 1){ 
      cout << "\n"; 
      cout <<"\nName  :: " <<e.first_name <<" "<<e.last_name; 
      //cout << "\n"; 
      cout <<"\nRoll Number :: " << e.roll_num ; 
      cout <<"\nCourse :: " <<e.course ; 
      cout <<"\nSection :: "<<e.section; 
      } 
      cout << "\n\n"; 
      system("pause"); 
      break; 

     case '3' : 
      system("cls"); 
      another = 'Y'; 
      while (another == 'Y'|| another == 'y') 
      { 
     //  cout << "\n Enter the last name of the student : "; 
       cout << "\n Enter the Roll number of the student : "; 
       cin >> xroll_num; 

      rewind(fp); 
      while (fread(&e,recsize,1,fp) == 1) 
      { 
       //if (strcmp(e.last_name,xlast_name) == 0) 
       if(e.roll_num == xroll_num) 
       { 
       cout << "Enter the new Firt Name : "; 
       cin >> e.first_name; 
       cout << "Enter the new Last Name : "; 
       cin >> e.last_name; 
       cout << "Enter the new Roll Number : "; 
       cin >> e.roll_num; 
       cout << "Enter the new Course : "; 
       cin >> e.course; 
       cout << "Enter the new Section : "; 
       cin >> e.section; 
       fseek(fp, - recsize, SEEK_CUR); 
       fwrite(&e,recsize,1,fp); 
       break; 
       } 
       else 
       cout<<"record not found"; 
      } 
      cout << "\n Modify Another Record (Y/N) "; 
       fflush(stdin); 
       another = getchar(); 
      } 
      break; 


     case '4': 
     system("cls"); 
      another = 'Y'; 
      while (another == 'Y'|| another == 'y') 
      { 
      // cout << "\n Enter the last name of the student to delete : "; 
       cout <<"\n Enter the roll number of the student to delete : "; 
       cin >> xroll_num; 

       ft = fopen("temp.dat", "wb"); 

       rewind(fp); 
       while (fread (&e, recsize,1,fp) == 1) 

       // if (strcmp(e.last_name,xlast_name) != 0) 
        if(e.roll_num == xroll_num) 
       { 
        fwrite(&e,recsize,1,ft); 
       } 
       fclose(fp); 
       fclose(ft); 
       remove("users.txt"); 
       rename("temp.dat","users.txt"); 

       fp=fopen("users.txt","rb+"); 

       cout << "\n Delete Another Record (Y/N) "; 
       fflush(stdin); 
       another = getchar(); 
       } 

       break; 

       case '5': 
       fclose(fp); 
       cout << "\n\n"; 
       cout << "\t\t  THANK YOU FOR USING THIS SOFTWARE"; 
       cout << "\n\n"; 
       exit(0); 
      } 
      } 
    system("pause"); 
return 0; 
} 
+0

你能在控制檯上打印「e.roll_num」的值嗎 – jaipster

+0

你調用這個C++的任何特定原因(但是用於'cout')? –

回答

1

它刪除所有不使用使得f匹配的卷號

那麼你只寫匹配的卷號到臨時文件中的記錄,然後其他記錄ILE覆蓋users.txt文件

if (e.roll_num == xroll_num) { 
    fwrite(&e, recsize, 1, ft); 
} 

我想你真正想要做的是

if (e.roll_num != xroll_num) { 
    fwrite(&e, recsize, 1, ft); 
} 

你或許應該好好讀讀C++的I/O教程,因爲你的代碼大多是C.考慮寫您的student結構作爲簡單的文本,而不是批量寫入文件。

+0

你可以建議我任何教程,我可以將所有值保存到行列順序或適當的Excel文件中? – user3562802

+0

@ user3562802 csv文件非常簡單易用,可以在excel中打開。 – user657267