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

Getline wysypujący całego case

0 głosów
548 wizyt
pytanie zadane 6 stycznia 2020 w C i C++ przez Piotr86PL Początkujący (340 p.)

Witam! Ostatnio chciałem sobie podsumować niektóre rzeczy z nauki i chciałem stworzyć program prosty notatnik + kalkulator w jednym w konsoli. Wszystko jest dobrze, ale napotkałem jeden błąd. Otóż kiedy chcę nadpisać plik lub dopisać tekst, używając getline wyrzuca mi całego case w switchu. Cin działa ale zależy mi na spacjach. Mógłby ktoś zerknąć na ten kod i dać mi podpowiedź na czym się skupić? Jeśli zajdzie potrzeba to mogę wysłać cały kod. Notatnik ten zapisałem w voidzie i wybieram 4 opcje. Tworzenie (działa), Wyświelanie (działa), Nadpisywanie (działa częściowo), Dopisywanie (działa częściowo). Skąd wiem, że to coś z getline? Wstawia mi poprawnie endl w pliku.

Oto ten case:

case '3':
    {
        cout << endl << "Podaj nazwe pliku: ";
        cin >> nazwa;
        nazwapliku = nazwa + ".txt";
        plik.open(nazwapliku.c_str(), ios::out);
        cout << "Napisz tekst:" << endl;
        getline(cin,tekst);
        plik << tekst << endl;
        plik.close();
        getchar();getchar();
        notatnik();
        break;
    }

 

A tak przy okazji, Mógł by też mi ktoś wytłumaczyć czemu ten case nie działa bez klamerek? Może to coś jest z tym związane.

 

Pozdrawiam. 

komentarz 6 stycznia 2020 przez tkz Nałogowiec (42,040 p.)
Case działa bez klamerek, może być problem z zasięgiem zmiennych, albo samą konstrukcją Twojego switch, to zależy...

Pokaż konstruktor fstream.
komentarz 6 stycznia 2020 przez Piotr86PL Początkujący (340 p.)
void notatnik()
{
    system("cls");
    char notopt;
    string nazwa;
    string nazwapliku;
    string tekst;
    fstream plik;
    cout << "========================" << endl;
    cout << "|    Menu Notatnika    |" << endl;
    cout << "========================" << endl << endl;
    cout << "[1] Utworz plik" << endl;
    cout << "[2] Wyswietl plik" << endl;
    cout << "[3] Nadpisz plik" << endl;
    cout << "[4] Dopisz do plik" << endl;
    cout << "[5] Wyjdz z programu" << endl;
    cout << "========================" << endl;
    cout << "Wybierz opcje: ";
    notopt = getch();

    switch(notopt)
    {
    case '1':
    {
        cout << endl << "Podaj nazwe pliku: ";
        cin >> nazwa;
        nazwapliku = nazwa + ".txt";
        plik.open(nazwapliku.c_str(), ios::out);
        plik.close();
        cout << "Plik txt o nazwie: " << nazwa << " zostal utworzony";
        getchar();getchar();
        notatnik();
        break;
    }
    case '2':
    {
        cout << endl << "Podaj nazwe pliku: ";
        cin >> nazwa;
        nazwapliku = nazwa + ".txt";
        plik.open(nazwapliku.c_str(), ios::in);
        if(plik.good() == false)
        {
            cerr << "Plik nieistnieje/jest uszkodzony. Brak dostepu!";
            exit(0);
        }
        while(!plik.eof())
        {
            getline(plik,tekst);
            cout << tekst << endl;
        }
        plik.close();
        getchar();getchar();
        notatnik();
        break;
    }
    case '3':
    {
        cout << endl << "Podaj nazwe pliku: ";
        cin >> nazwa;
        nazwapliku = nazwa + ".txt";
        plik.open(nazwapliku.c_str(), ios::out);
        cout << "Napisz tekst:" << endl;
        getline(cin,tekst);
        plik << tekst << endl;
        plik.close();
        getchar();getchar();
        notatnik();
        break;
    }
    case '4':
    {
        cout << endl << "Podaj nazwe pliku: ";
        cin >> nazwa;
        nazwapliku = nazwa + ".txt";
        plik.open(nazwapliku.c_str(), ios::out | ios::app);
        cout << "Napisz tekst:" << endl;
        getline(cin,tekst);
        plik << tekst << endl;
        plik.close();
        getchar();getchar();
        notatnik();
        break;
    }
    case '5':
        exit(0);
        break;
    default:
        cout << "Nie ma takiej opcji w menu!";
        notatnik();
        break;
    }
}

To ten pełen void. I przed chwilą ciekawa rzecz się zdarzyła. Odpaliłem bezpośrednio z exe, wpisuje długi test i najpierw nic a za drugim uruchomieniem automatycznie utworzyło mi plik kis.txt a w nim "tam tekst". To co wpisałem brzmiało "Jakis tam tekst"

komentarz 6 stycznia 2020 przez tkz Nałogowiec (42,040 p.)
Nie czyścisz bufora po getline().
komentarz 6 stycznia 2020 przez Piotr86PL Początkujący (340 p.)
Chyba że tak. A można się spytać jak to wyczyścić, po co to jest i dlaczego tak trzeba robić. Albo przynajmniej jak. Nie widziałem tego na kursach albo pominąłem to. Ale dziękuję za odpowiedź.
komentarz 6 stycznia 2020 przez tkz Nałogowiec (42,040 p.)
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Przed każdym getlinem. Czyścisz bufor iostream'a z nadmiarowych białych znaków. 

komentarz 6 stycznia 2020 przez Piotr86PL Początkujący (340 p.)
Oki. Dziękuję za pomoc.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

–1 głos
2 odpowiedzi 1,678 wizyt
pytanie zadane 31 stycznia 2018 w C i C++ przez niezalogowany
+1 głos
2 odpowiedzi 990 wizyt
pytanie zadane 17 kwietnia 2021 w C i C++ przez Doge Gaduła (3,420 p.)
0 głosów
1 odpowiedź 1,627 wizyt
pytanie zadane 12 maja 2020 w C i C++ przez Maciex0n Nowicjusz (160 p.)

93,757 zapytań

142,716 odpowiedzi

323,363 komentarzy

63,354 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...