Facebook Sharer
选择您要替换的背景颜色:
【农历新年】背景图片:
个性化设定
 注册  找回密码
查看: 837|回复: 6
打印 上一主题 下一主题

C++ increment ID 问题

 关闭 [复制链接]

11

主题

6

好友

2608

积分

白金长老

Rank: 10

跳转到指定楼层
1#
发表于 2013-8-26 10:31 PM |只看该作者 |倒序浏览
以下是我的code,当user输入record的时候,ID就是1,2,3.......,n
如果我delete 第三个record,他的ID下一次就会变去3
不过现在如果我delete 第二个record,他的ID就要变去4,
就像是1,3,4,5,6,7....,n 请问我应该如何去做
  1. #include <iostream>
  2. #include <fstream>
  3. #include<iomanip>
  4. #include <string>
  5. using namespace std;

  6. //--------------------------------CLASS--------------------------------
  7. class IMDB
  8. {
  9.     private:
  10.             char mvName[20];
  11.             float rating;
  12.             int mvID;
  13.     public:
  14.             void getMV();
  15.             void getMVEdit();
  16.             void showMV();
  17.             void showMVEdit();
  18.             int deleteID();
  19. };//end class

  20. //Insert all the movie details
  21. void IMDB::getMV()
  22. {  
  23.     //read all file to get the ID and  the ID is auto increment by 1
  24.     IMDB st;

  25.     ifstream thisfile;
  26.     thisfile.open("Movie Record.dat",ios::binary);

  27.     if(!thisfile.eof())
  28.     {
  29.         mvID = 1;
  30.     }

  31.     while(thisfile.read(reinterpret_cast<char *> (&st), sizeof(IMDB)))
  32.     {                              
  33.         ++mvID;  
  34.     }  
  35.     thisfile.close();
  36.    
  37.     cout << "Movie ID: " << mvID << endl;

  38.         //Enter all the record       
  39.     cout << "Enter movie name: ";
  40.     cin.ignore(1000,'\n');
  41.         cin.getline(mvName,20);
  42.    
  43.     cout << "Enter movie rating(0-5): ";
  44.     while((!(cin >> rating)) || (rating < 0 || rating > 5))
  45.     {
  46.         cout << "Enter number between 0-5! Please try again: ";
  47.         cin.clear();
  48.         cin.ignore (1000,'\n');
  49.     }
  50. }

  51. //Display all the movie have been added
  52. void IMDB::showMV()
  53. {
  54.     cout << "Movie ID: " << mvID;
  55.     cout << "\nMovie Name: " << mvName;
  56.     cout << "\nRating: " << fixed << showpoint << setprecision(1) <<rating << endl;
  57. }


  58. //Return the movie ID for the purpose of delete
  59. int IMDB::deleteID()
  60. {
  61.     return mvID;
  62. }

  63. //--------------------------------FUNCTION DEFINATION--------------------------------

  64. void displayMenu()
  65. {
  66.      cout << "Welcome, What would you like to do?\n"
  67.           << "1 => Add a Movie\n"
  68.           << "2 => View a Movie\n"
  69.           << "3 => Delete a Movie\n"
  70.           << "4 => Quit\n"
  71.           << endl;
  72.      cout << "Choice => ";
  73. }

  74. //*****************************FUNCTION WRITE MOVIE*****************************
  75. void writeMV()
  76. {
  77.      IMDB st;
  78.      ofstream myfile;
  79.      
  80.      //create new file name name Movie Record.dat
  81.          myfile.open("Movie Record.dat",ios::binary | ios::app);
  82.            st.getMV();//get data from getMV()
  83.            myfile.write(reinterpret_cast<char *> (&st), sizeof(IMDB));
  84.          myfile.close();
  85.          
  86.          system("PAUSE");
  87. }

  88. //*****************************FUNCTION DISPLAY MOVIE*****************************
  89. void displayMV()
  90. {
  91.     IMDB st;
  92.     ifstream thisfile;
  93.     thisfile.open("Movie Record.dat",ios::binary);

  94.     if(!thisfile)
  95.     {
  96.         cout << "You haven't insert any record yet!\n";
  97.         }
  98.        
  99.         //Display all the record
  100.         while(thisfile.read(reinterpret_cast<char *> (&st), sizeof(IMDB)))
  101.         {
  102.                 st.showMV();
  103.                 cout << "\n--------------------------------------\n";
  104.         }
  105.        
  106.         thisfile.close();
  107.         system("PAUSE");
  108. }

  109. //***************************FUNCTION DELETE MOVIE***************************
  110. void deleteMV(int number)
  111. {
  112.     IMDB st;
  113.         ifstream thisfile;
  114.         thisfile.open("Movie Record.dat", ios::binary);
  115.        
  116.         if(!thisfile)
  117.         {
  118.                 cout<<"You haven't insert any record yet!\n";
  119.         }
  120.     else
  121.     {     
  122.         cout << "Enter movie ID to delete the record: ";
  123.         while(!(cin >> number))
  124.         {
  125.             cout << "Enter number only! Please try again: ";
  126.             cin.clear();
  127.             cin.ignore (1000,'\n');
  128.         }
  129.     }
  130.    
  131.     ofstream myfile;
  132.         myfile.open("Temp.dat",ios::out);
  133.        
  134.         thisfile.seekg(0,ios::beg);//read the file from beginning
  135.         while(thisfile.read(reinterpret_cast<char *> (&st), sizeof(IMDB)))
  136.         {
  137.                 if(st.deleteID()!= number)
  138.                 {
  139.                         myfile.write(reinterpret_cast<char *> (&st), sizeof(IMDB));
  140.                 }
  141.         }
  142.         myfile.close();
  143.         thisfile.close();
  144.         remove("Movie Record.dat");
  145.         rename("Temp.dat","Movie Record.dat");
  146.        
  147.         cout << "Movie successful deleted!" << endl;
  148.     system("PAUSE");
  149. }



  150. //--------------------------------MAIN FUNCTION--------------------------------
  151. int main()
  152. {
  153.     int number;
  154.     int selectOpt;
  155.     bool done = false;
  156.    
  157.     do
  158.     {
  159.         displayMenu();
  160.         cin >> selectOpt;
  161.    
  162.         switch(selectOpt)
  163.         {
  164.             case 1 : writeMV();break;
  165.             case 2 : displayMV();break;
  166.             case 3 : deleteMV(number);break;
  167.             case 4 : done = true;
  168.                        break;
  169.             default : cout << "Invalid selection, try again!" << endl;
  170.                       cin.clear();
  171.                       cin.ignore (1000, '\n');
  172.                       system("PAUSE");
  173.         }
  174.     }while(!done);
  175.   
  176.     system("PAUSE");
  177.     return 0;
  178. }
复制代码




收藏收藏0

1

主题

1

好友

204

积分

支柱会员

Rank: 4Rank: 4Rank: 4Rank: 4

2#
发表于 2013-8-27 12:12 AM |只看该作者
本帖最后由 XiaoCarol 于 2013-8-27 12:14 AM 编辑

基本上你delete mv 时不用从main() 那边pass parameter过去
  1. void deleteMV(int number)
复制代码
可以改成
  1. void deleteMV()
复制代码
这个declaration
  1. int number;
复制代码
可以放进function body里面,不用放在main()



那个increment的问题。。
可以试下用array来store boolean value
假如有record 就true。。
没有record就false。。
当你下次要add new mv。。
在loop那边
看到false的就可以用回那个ID。。



回复

使用道具 举报

11

主题

6

好友

2608

积分

白金长老

Rank: 10

3#
发表于 2013-8-27 12:50 AM |只看该作者
本帖最后由 孤独迷惑 于 2013-8-27 02:01 AM 编辑
XiaoCarol 发表于 2013-8-27 12:12 AM
基本上你delete mv 时不用从main() 那边pass parameter过去可以改成这个declaration可以放进function body里 ...


至于array那部分,我不是很清楚
因为我刚踏入c++罢了

就例如我在class declare一个 bool checkID[100], 就先让他的size assume 100
然后到了getMV() function 写我的bool condition
如果没有record是等于1,有record就拿最后一个element + 1 ,大概是这样吧?

我有的逻辑是直接跑去file的最后一排,然后找出最后一排的ID然后+1,就大概这样吧~


回复

使用道具 举报

1

主题

1

好友

204

积分

支柱会员

Rank: 4Rank: 4Rank: 4Rank: 4

4#
发表于 2013-8-27 12:15 PM |只看该作者
孤独迷惑 发表于 2013-8-27 12:50 AM
至于array那部分,我不是很清楚
因为我刚踏入c++罢了

以你的logic也是可行的 xD
用你比较容易明白的方法做吧

其实我不是很会C++的
我学Java而已


回复

使用道具 举报

11

主题

6

好友

2608

积分

白金长老

Rank: 10

5#
发表于 2013-8-27 08:52 PM |只看该作者
XiaoCarol 发表于 2013-8-27 12:15 PM
以你的logic也是可行的 xD
用你比较容易明白的方法做吧  

到最后我放弃了
因为不是很厉害用class来做
做到自己都懵懂懂了


回复

使用道具 举报

19

主题

0

好友

132

积分

高级会员

Rank: 3Rank: 3Rank: 3

6#
发表于 2013-9-6 11:02 PM |只看该作者
class我也没学过但你这个情况用link-list会比较好 我觉得啦


回复

使用道具 举报

18

主题

0

好友

320

积分

超级会员

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

7#
发表于 2013-9-22 07:57 AM |只看该作者
bearbear520 发表于 2013-9-6 11:02 PM
class我也没学过但你这个情况用link-list会比较好 我觉得啦

linklistperformance 没那么好。用tree吧!比较容易找


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

JBTALKS.CC |联系我们 |隐私政策 |Share

GMT+8, 2024-12-26 03:11 PM , Processed in 0.100066 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

Ultra High-performance Dedicated Server powered by iCore Technology Sdn. Bhd.
Domain Registration | Web Hosting | Email Hosting | Forum Hosting | ECShop Hosting | Dedicated Server | Colocation Services
本论坛言论纯属发表者个人意见,与本论坛立场无关
Copyright © 2003-2012 JBTALKS.CC All Rights Reserved
合作联盟网站:
JBTALKS 马来西亚中文论坛 | JBTALKS我的空间 | ICORE TECHNOLOGY SDN. BHD.
回顶部