2013-03-18 38 views
0

过去8小时我一直在搞这个程序,我不知道该往哪里走。我非常抱歉我的代码是用外语写的,我试着用英语对它进行评论以尽我所能。 我设法调试它,但我有几个问题。 1)如何打印前5行(txt失败的前5行),然后是前5个?我的可怜尝试列在下面。例如: 起初你有Memento,教父。你打印下五个教父II,肖申克救赎,莱昂,一个苦乐参半的人生,Se7en.Now前5:纪念品,教父,教父II,肖申克救赎,莱昂 2)如何使用字符而不是数字来制作菜单该程序? 3)我真的很愚蠢吗?请诚实地回答。 我现在休息一下,睡一会儿,早上会通过答复,希望它不会违反规则。C++中的数据库问题

#include <iostream> 
#include <string> 
#include <fstream> 

using namespace std; 

void sisend(); /*input*/ 
string valik(); /*choice*/ 
void kogukuvand(); /* the whole display of the database */ 
void valjumine(); /* program quit*/ 
void sisendvoivaljumine(); /*quiting with output to file or not*/ 
void viisjuurde(); /* input further 5 lines from the file */ 
void viismaha(); /* input previous 5 lines from the file*/ 





int main() 
{ 




     system ("title Filmide andmebaas"); /*Movie database*/ 
     system ("cls"); 
     int valik; 
     cout << "Vajuta klahv 'j',kui tahad naha jargmist 5 kirjet."<< endl; /* j to get extra 5*/ 
     cout << "Vajuta klahv 'e',kui tahad naha eelmist 5 kirjet."<< endl; /* e for previous 5 lines */ 
     cout << "Vajuta klahv 'v',kui tahad lopetada programmi taitumist."<< endl; /* v for the output */ 
    cin >> valik; 

switch (valik) {     /*choice*/ 

      case 1: 
        viisjuurde(); 
        break; 
      case 2: 
       viismaha(); 
       break; 
      case 3: 

       sisendvoivaljumine(); 
       break; 
       } 
       } 
void viisjuurde() 
{ 
     ifstream filmike("andmebaas.txt"); 
     int n, sum = 5; 
    while (filmike >> n) { 
     sum += n; 

     string film; 
     string vaadatud; 
    int aasta; 
    long int hinne; 
     system ("CLS"); 
     cout << "Kogu filmide andmebaas"<<endl; 
    cout << "Film" << " " << "Aasta" << " " <<"Hinne"<< " " << "Vaadatud" << endl; 
     cout << "------------------------------" << endl; 
     while (filmike>> film >> aasta >> hinne >> vaadatud) 
    { 
     cout << film << " " << aasta << " " << hinne << " " << vaadatud << endl; 
    } 
     system ("pause"); 
     cin.get(); 
     main(); 

    } 
} 
    void viismaha() 
{ 
     ifstream filmike("andmebaas.txt"); 
     int n, sum = -5; 
    while (filmike >> n) { 
     sum += n; 
    } 
     string film; 
     string vaadatud; 
    int aasta; 
    long int hinne; 
     system ("CLS"); 
     cout << "Kogu filmide andmebaas"<<endl; 
    cout << "Film" << " " << "Aasta" << " " <<"Hinne"<< " " << "Vaadatud" << endl; 
     cout << "------------------------------" << endl; 
     while (filmike>> film >> aasta >> hinne >> vaadatud) 
    { 
     cout << film << " " << aasta << " " << hinne << " " << vaadatud << endl; 
    } 
     system ("pause"); 
     cin.get(); 
     main(); 

    } 
void sisend() /* user input */ 
{ 
    string nimi; 
    int aasta; 
    long int hinne; 
    string vaadatud; 
    ofstream lisafilm("andmebaas.txt", ios::app); 
    cout <<"Sisestage filmi nimi." << endl; /*Enter film's name */ 
    cin >> nimi; 
    string film; 

    cout << "Sisestage filmi ilmumisaasta." << endl; /* Enter film's year */ 
    cin >> aasta;  

    cout << "Sisestage filmi hinne." << endl; /* Enter film's rating */ 
    cin >> hinne; 

    cout << "Kas olete filmi juba vaadanud?" << endl; /* Has the user seen the movie already*/ 
    cout << "Vastake 'Jah' voi 'Ei'" << endl; 
    cin >> vaadatud; 
cout << film << " " << aasta << " " << hinne << " " << vaadatud << endl; 

lisafilm<< nimi << " " << aasta << " " << hinne<< " " << vaadatud << endl; 
lisafilm.close(); 
main(); 

cout << "Aitah kasutamast andmebaasi." << endl; 
system("pause"); 
cin.get(); 
} 



void valjumine() /*quiting without output */ 
{ 
system("CLS"); 
cout << "Aitah kasutamast andmebaasi." << endl; 
system("pause"); 
cin.get(); 
    } 
void kogukuvand() /* the whole movie database*/ 
{ 
     ifstream filmike("andmebaas.txt"); 
     string film; 
     string vaadatud; 
    int aasta; 
    long int hinne; 
     system ("CLS"); 
     cout << "Kogu filmide andmebaas"<<endl; 
    cout << "Film" << " " << "Aasta" << " " <<"Hinne"<< " " << "Vaadatud" << endl; 
     cout << "------------------------------" << endl; 
     while (filmike>> film >> aasta >> hinne >> vaadatud) 
    { 
     cout << film << " " << aasta << " " << hinne << " " << vaadatud << endl; 
    } 
     system ("pause"); 
     cin.get(); 
     main(); 

    } 
void sisendvoivaljumine() 
{ 
    int valik2; 
    system ("CLS"); 
    cout << "Vajuta klahv 'j',kui tahad salvestada kirje ja v2ljuda programmist." << endl; /* output new movie to file and quit*/ 
    cout << "Vajuta klahv 'e',kui ei taha salvestada kirje ja v2ljuda programmist." << endl; /*just quit, without any output to file*/ 
    cout << "Vajuta klahv 'k',kui tahad naha kogu filmide andmebaasi." << endl; /* display the whole movie database*/ 
    cin >> valik2; 


    switch (valik2) 
    { 


     case 1: 
       sisendvoivaljumine(); 
       break; 
       sisend(); 
       break; 
     case 2: 
       valjumine(); 
       break; 
     case 3: 
       kogukuvand(); 
       break; 



} 
} 
+0

作业标签已折旧。删除。 – Casey 2013-03-18 01:22:51

+2

@Casey,也许你的意思是*弃用*? – Shoe 2013-03-18 03:20:34

+0

@Jeecy Yeah,那'我'是偷偷摸摸的。 :P – Casey 2013-03-18 11:22:19

回答

1

一些提示:

  1. 缩进,并根据共同约定格式化你的代码。它使您阅读和调试(以及其他所有人)变得更加容易。

  2. 您正在递归调用main()。不要那样做。改为使用菜单开关周围的循环。

  3. 从文件中读取行的一种很好的故障保护方法是使用getline()。与istringstream相结合,从线读取各个值:

    ifstream infile("somefile.txt"); 
    string line; 
    while (getline(infile, line)) // read infile until eof 
    { 
        istringstream iss(line); // create stream from line data 
        string a, b, c, d; 
    
        iss >> a >> b >> c >> d; // read just as from cin 
        cout << a << "," << b << "," << c << "," << d << endl; 
    } 
    
  4. 如果你读成整数,你需要验证读取成功(除非您确信该文件在点包含的数字你在哪里读):

    int n; 
    if (iss >> n) 
    { 
        // read OK 
    } 
    else 
    { 
        // read failed 
        infile.clear(); 
        string junk; 
        infile >> junk; 
        cout << "ERROR: bad data was:" << junk << endl; 
    } 
    
  5. 要使用菜单字符,你可以使用char数据类型。这是一个好主意,因为字符输入不会失败:

    char choice; 
    cin >> choice; 
    switch (choice) 
    { 
        case '1': 
        { 
         // do something 
         break; 
        } 
        case 'A': 
        { 
         // do something 
         break; 
        } 
    } 
    
  6. 当心递归调用自己,当你选择该选项。由于菜单可以一遍又一遍地重复选择,无限地,您最好使用循环重复菜单。

想要阅读上述主题。检查http://www.cplusplus.com。 当您调试时,确保您确切知道程序在每个点执行的是哪一行。添加清除调试输出来帮助你。