2017-12-19 7 views
1

Ich bin ein sequentielles Programm auf Library Management System Schreiben die von zwei structs (Bücher und Studenten) und mehrere Funktionen besteht.C++ Programm springt über die Leitungen während der Eingang unter [Konsolenanwendung]

Alles funktioniert dementsprechend außer wenn ich versuche, Konsole Eingang in der Funktion add_new_book() für das struct Buch, es überspringt Linie zu nehmen, während Eingang nehmen. Ich habe vorher recherchiert und dann die Funktion cin.ignore() verwendet. Diese Funktion arbeitet für die ersten beiden String-Eingänge, aber nachdem sie die ersten zwei Eingaben gemacht hat, überspringt sie die verbleibenden Eingabezeilen und beendet die Funktion.

Hier unten ist der Code von struct Buch und Funktion add_new_book()

struct books{ 
    int book_id; 
    string book_name; 
    string author_name; 
    string subject; 
    int fine; 

}; 

void add_new_book(){ 

    struct books b; 
    cout << "Enter the Book Name : "; 
    getline(cin, b.book_name); 
    cin.ignore(); 
    //cin >> b.book_name; 
    cout << "Enter Author's Name : "; 
    getline(cin, b.author_name); 
    cin.ignore(); 
    cout << "Enter Book id : "; 
    cin >> b.book_id; 

    cout << "Enter Book Cost : "; 
    cin >> b.fine; 
    cin.ignore(); 
    cout << "Enter the Subject : "; 
    getline(cin, b.subject); 

    cout << "\n",b.book_name,b.author_name,b.book_id,b.fine,b.subject; 
      cout << "\n\n\t\t SUCCUSSFULLY ADDED \n"; 
    // open a file in write mode. 
    ofstream outfile; 
    outfile.open("book1.txt"); 
    outfile << b.book_name << endl; 
    outfile.close(); 
    admin(); 
} 
+0

1. Bitte beheben Sie die seltsame Einrückung und überflüssige Leerzeilen in Ihrem Code. 2. Ich weiß nicht, was Sie denken 'cout <<" \ n% 25s% 25s% 25s% 25d% 25d % 25s ", b.buch_name, b.autor_name, b.buch_id, b.fine, b. Subject; 'tut, aber es ist eine langatmige Art zu sagen' cout << bsubject; '. Wenn Sie den Compiler-Warnlevel auf Maximum stellen, wird es sich beschweren. –

+0

3: 'struct books b': Das ist C++, man kann einfach' books b; 'schreiben - auch würde ich die Klasse mit der Singular nennen (verwende den Plural für einen Container mit mehreren Büchern) - also' book b' ; –

Antwort

1

Ich schlage vor, loswerden cin.ignore ‚s zu bekommen und auch getline für numerische Felder verwenden, ein std :: string als temporärer Puffer:

string s; 
cout << "Enter Book id : "; 
//cin >> b.book_id; 
getline(cin, s); 

Sobald Sie die Benutzereingabe in einem String haben, überprüfe seinen Wert und weise ihn schließlich dem struct-Feld zu, z das Buch ID int umgewandelt werden, auf diese Weise:

if(b.book_id == 0) 
{ 
    cout << "Invalid book id"; 
} 

auch durchgeführt werden, wird cout nicht verwendet wird, kann

b.book_id = std::atoi(s.c_str()); 

atoi wird wieder Null, wenn keine Umwandlung der Art und Weise gemeint werden Sie tun . Ich würde versuchen, etwas sauber und ordentlich, wie folgt:

cout << "Title : " << b.book_name << endl; 
cout << "Author: " << b.author_name << endl; 
//etc ... 
+0

Es hat funktioniert. Vielen Dank –

0

Sie nicht std::cin.ignore() nach std::getline() nennen sollte. getline extrahiert die '\n' aus dem Eingabestrom am Ende der Zeile. Der Aufruf ignore extrahiert und verwerfen eine andere Zeile.

+0

Das habe ich vorher gemacht. Aber es überspringt dann auch die Eingabe der Zeichenkette –

+0

@AhmedAdnan Sie wissen, dass Sie immer noch nur "bject" drucken? –

Verwandte Themen