Program ignoruje jednego getline'a

0

Witam. W kodzie poniżej mam problem w funkcji dodaj(). Program ignowuje pierwszego getline'a i w efekcie tego na ekranie zostaje wyświetlone "Podaj nazwe:Podaj klucz:" i dopiero w tym momencie można cokolwiek wpisać. Z ciekawości próbowałem odwrócić w kodzie kolejność podawania nazwy i klucza i zawsze ta pierwsza wykorzystana zmienna była pomijana.

Z góry dziękuję za pomoc.

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

const char *file = "keys.txt";

void showmenu();
void wyswietl();
void dodaj();
void usun_rekord();
void usun_wszystko();

int main()
{
	using namespace std;
	char ch;
	
	
	showmenu();
	int option;
	cin >> option;
	while (option != 0)
	{
		switch(option)
		{
			case 1 : wyswietl();
				 	 break;
			case 2 : dodaj();
				 	 break;
			case 3 : usun_rekord();
				 	 break;
			case 4 : usun_wszystko();
				 	 break;
			case 0 : exit;
			default : cout << "Nie ma takiej opcji\n";
		}
		showmenu();
		cin >> option;
	}
	cout << "Do zobaczenia!" << endl;
	return 0;
}


void wyswietl()
{
	
// pokaż początkową zawartość pliku
	using namespace std;
	char ch;
	
	ifstream fin;
	fin.open(file);
	
	if (fin.is_open())
	{
		cout << "Oto aktualna zawartosc pliku " << file << ":\n";
		while (fin.get(ch))
			cout << ch;
		fin.close();
	}
}

void dodaj()
{

// dodaj nowe rekordy

	using namespace std;
	
	ifstream fin;
	fin.open(file);
	
	ofstream fout(file, ios_base::out | ios_base::app);
	if (!fout.is_open())
	{
		cerr << "Nie mozna otworzyc pliku " << file << " do zapisu.\n";
		exit(EXIT_FAILURE);
	}
	
	cout << "Podaj nazwe programu i jego klucz\n";
	string name, key;

		cout << "Podaj nazwe:";
		getline(cin,name);
		fout << name << "\t";
		
		cout << "Podaj klucz:";
		getline(cin,key);
		fout << key << endl;


	fout.close();
}

void usun_rekord()
{
	using namespace std;
	
	cout << "-----";
}

void usun_wszystko()
{
	using namespace std;
	
	cout << "----";
}

void showmenu()
{
	using namespace std;
	
	cout << "Witaj"<<endl<<"Oto opcje programu:\n"<<endl;
	cout << "1 - Pokaz zawartosc pliku"<<endl<<"2 - Dodaj nowy rekord"<<endl;
	cout << "3 - Usun wybrany rekord"<<endl<<"4 - Usun wszystkie rekordy"<<endl;
	cout << "0 - Wyjdz z programu"<<endl;
} 
0

problem jest z cin >> liczba. cin zbiera liczbe z wejscia a enter ktory wciskasz nadal tam zostaje. jednym z rowiazan jest:
cin.ignore(1000,'\n ');
przed samym getline (teoretycznie powinienes to robic po kazdym wczytaniu wszystkiego co nie zbiera entera, ale tak tez w wiekszosci przypadkow zadziala)

0

inne rozwiązanie to zignorowanie wszystkich białych znaków przed getline:

cin >> std::ws;
2

Wygodnie jest wszystko czytać getline'em i konwertować przez istringstream. Nie trzeba wtedy wyciągać białych znaków ani czyścić flag. Np.

bool TryStrToInt(const std::string &str, int *ret)
{
    return std::istringstream(str) >> *ret;
}

int StrToIntDef(const std::string &str, int default)
{
    int ret;
    return TryStrToInt(str, &ret) ? ret : default;
}

std::string ReadLine()
{
    std::string ret;
    std::getline(std::cin, ret);
    return ret;
}

/* ... */

showmenu();
int option = StrToIntDef(ReadLine(), -1);
switch (option) {
    case 0:

/* ... */

cout << "Podaj nazwe:";
name = ReadLine();

/* ... */
0

Wygodnie się konwertuje liczby za pomocą boost::lexical_cast:

#include <boost/lexical_cast.hpp>
#include <string>

using namespace std;
using namespace boost;

int main()
{
	string s = lexical_cast<string>(42);
	int j = lexical_cast<int>("123123");
}

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