• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ czyszczenie cin

Object Storage Arubacloud
0 głosów
511 wizyt
pytanie zadane 19 czerwca 2018 w C i C++ przez magmat Początkujący (390 p.)
class book {
    int ID_book;
    string title, author;
public:
    void add_book();}

void book::add_book() {
    cout << "Creating new book: " << endl;
    cout << "ID: ";
    cin >> ID_book;
    cout << endl << "Title: ";
    getline(cin,title);
    cin.get();
    cout << endl << "Author: ";
    getline(cin,author);
    cin.get();
    }

void write_books() {
    char choice;
    fp.open("books.txt");
    do {
        system("cls");
        bk.add_book();
        fp.write((char*)&bk, sizeof(book));
        cout << "Do you want to add more records? Y-yes;";
        cin >> choice;
        cin.clear();
    } while (choice == 'y' || choice == 'Y');
    fp.close();
    system("cls");
}

int main()
{
    int choice;
    cout << "---=== Library ==---" << endl;
start:
    choice = 0;
    cout << "What do you want to do?"
        << endl << "1. Add new book."
        << endl << "2. Add new user."
        << endl << "3. Show all books."
        << endl << "4. Show all users."
        << endl << "5. Exit.";

    cin >> choice;

    switch (choice) {
    case 1:
        system("cls");
        write_books();
        break;
...
    case 5: 
        return 0;
    }
    goto start;
}

Po wywołaniu w mainie write_books(); po wpisaniu autora nie pojawia się komunikat: do you want to add more records. Wyskakuje w pętli menu główne (what do you want to do? ... ). 

2 odpowiedzi

+1 głos
odpowiedź 20 czerwca 2018 przez j23 Mędrzec (194,920 p.)
wybrane 20 czerwca 2018 przez magmat
 
Najlepsza

Linia 5: brakuje średnika kończącego definicję klasy.

Linia 24: gdzie jest definicja bk?

Linia 25: nie możesz tak zapisywać (tzn. możesz, ale nie odczytasz poprawnie danych). Poczytaj o serializacji obiektów. Obiekty klasy string zapisane w ten sposób są nie do odtworzenia.

Linia 27: clear czyści flagi błędu, a nie strumień. Użyj metody ignore.

komentarz 20 czerwca 2018 przez magmat Początkujący (390 p.)
@j23, średnik jest ale omyłkowo nie skopiowałam.

definicja bk jest w innej części programu, wkleiłam tylko tę w której musi być błąd.

czy zamienienie string na char to jest jakieś wyjście?

zamiana na ignore nie przyniosła efektu. dalej nie mogę dodawac wiecej rekordów
komentarz 20 czerwca 2018 przez magmat Początkujący (390 p.)

@j23, zmieniłam string na char ale nadal ta sama sytuacja

komentarz 20 czerwca 2018 przez j23 Mędrzec (194,920 p.)

Tak spróbuj:

void book::add_book() 
{
	cout << "Creating new book: \nID: \n";
	cin >> ID_book;
	cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	cout << "Title: ";
	getline(cin, title);
	cout << "Author: ";
	getline(cin,author);
}

 

czy zamienienie string na char to jest jakieś wyjście?

A dlaczego zapisujesz binarnie? Nie prościej w postaci tekstowej, korzystając z operatora wyjścia <<?

komentarz 20 czerwca 2018 przez magmat Początkujący (390 p.)

nie działa tak wpisanie spacji. 

już problem rozwiązany. Pod bk.add_book() należało wpisac:         

cin.ignore(numeric_limits < streamsize > ::max(), '\n');

 

+1 głos
odpowiedź 20 czerwca 2018 przez Szfierzak Gaduła (3,750 p.)

Po wczytaniu przez

cin.get();

pustej linii w postaci entera, to flaga failbit jest ustawiana na 1, aż do momentu 

cin.clear();

Czyli do powyższego momentu nie będziesz mógł nic wczytać. Spróbuj ustawić cin.clear() zaraz po wywołaniu funkcji add_book()

//...
bk.add_book();
cin.clear();
//...

 

komentarz 20 czerwca 2018 przez magmat Początkujący (390 p.)
niestety nic nie zmieniło.  po wczytaniu autora zaczyna cos sie psuc

Podobne pytania

0 głosów
1 odpowiedź 2,604 wizyt
pytanie zadane 25 października 2018 w C i C++ przez XezolPL Obywatel (1,530 p.)
+1 głos
2 odpowiedzi 1,552 wizyt
pytanie zadane 7 października 2018 w C i C++ przez Hinzeq Użytkownik (860 p.)
0 głosów
1 odpowiedź 7,530 wizyt
pytanie zadane 16 grudnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...