getline - cos nie tak ... ; /

0

mam taki malutki interfejs w C++
ale (jak zawsze)... znajdzie sie gdzies blad ... ; [
czy moglby mi ktos wytlumaczyc dla czego 46 linia kodu nie dziala ??

getline(cin,tekst);
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <conio.h>
#include <windows.h>


using namespace std;

int main()
{
    string tekst;
    char pot;
    
    while(1)
    {
        cout << "Jesli chcesz wczytac tekst z pliku wcisnij : 'P'\nJesli chcesz wpisac tekst recznie wcisnij : 'R'\n";
        cin >> pot;
        system("cls");
        
        if((pot == 'p') || (pot == 'P'))
        {
            ifstream rob;
            rob.open("tekst.txt");
            
            if(!rob)
            {
                cout << "Blad odczytu pliku.\n1* Sprawdz czy plik ma nazwe 'tekst.txt'.\n";
                cout << "2* Sprawdz czy plik jest w tym samym folderze co program.\n";
                cout << "3* Sprawdz czy plik ma rozszezenie '.txt'.\n\n\n";
                pot = 'x';
                system("pause");
                system("cls");
            }
            else
            {
                getline(rob, tekst);
                break;
            }
        }
        else
            if((pot == 'r') || (pot == 'R'))
            {
                cout << "Podaj tekst.\n";
                getline(cin, tekst);
                cout << "Czemu ten napis sie pojawia?\nPrzeciez jeszcze nie podalem tekstu ... Blad ...";
                break;
            }
            else
            {
                cout << "Podales nieprawidlowy znak, musisz sprobowac ponownie";
                Sleep(2000);
                system("cls");
            }
    }

    getch();
    return 0;
}
0

Bo cin>> NIE WCZYTUJE BIAŁYCH ZNAKÓW, w szczególności nie wczytuje "entera" którym potwierdzasz wprowadzenie tego chara. Ten znak nowej linii cały czas leży w stdin i getline() go sobie wczytuje. Efekt jest taki ze string do którego getline miał coś wczytać jest pusty. Rozwiązanie? cin.sync() albo cin.ignore() po wczytaniu chara.

1

wywal conio.h oraz window.h (pierwsze bo tego się nie powinno używać, a drugie bo jest dołączone bez sensu). I dołącz nagłówek string (bez h).

0

ale teraz wczytuje tylko jeden znak ... a mial wczytywac caly ciag znakow lacznie z bialymi znakami oprocz znakow nowej linii.

obydwa naglowki musza byc ...
conio.h - getch();
wingows.h - Sleep();

0

Tak jak mówił Shalom, cin.ignore() rozwiązuje Twój problem

        cout << "Jesli chcesz wczytac tekst z pliku wcisnij : 'P'\nJesli chcesz wpisac tekst recznie wcisnij : 'R'\n";
        cin >> pot;
        cin.ignore(); //właśnie to trzeba dopisać
1
maciek19922 napisał(a)

obydwa naglowki musza byc ...
conio.h - getch();
wingows.h - Sleep();

conio.h NIE POWINIEN BYĆ. Użyj:

cin.sync();
cin.get();

Jednak ogólnie zatrzymywanie programu pod koniec wykonania to zły pomysł.

0

@winerfresh - a mógłbyś to uzasadnić?

0

@winerfresh - a mógłbyś to uzasadnić?

No ja to wszystkie programy uruchamiam z konsoli więc nie muszę zatrzymywać :P

1
Blood napisał(a)

@winerfresh - a mógłbyś to uzasadnić?

  1. niepraktyczność
  2. niemożność automatycznego testowania
  3. stosowanie starych i niezalecanych bibliotek (conio.h)
0

Dzieki wielkie za pomoc ... : ]
wiedzialem ze zawsze mozna liczyc na wsza pomoc : ]
jeszcze raz dzieki wielkie : ]

1 użytkowników online, w tym zalogowanych: 0, gości: 1