nadużywanie strumienia cin.

0

Cześć. Mam kod który w bardzo dużej części polega na strumieniu cin. I teraz mój problem. Mój program wczytuje ze strumienia cin po czym wykonuje kilka działań i to wszystko. Ale co teraz jeśli chciałbym zapętlić działanie programu? Nie da się kilkakrotnie użyć rzeczyz cin. Pomyślałem że mógłbym jako argument podawać to co ma trafić do strumienia cin. Funkcja wkłada to co chce do cin za pomocą cin.putback po czym operuje na danych i powtarza to ile razy chce. Nie wiedziałem czy to będzie działać więc zrobiłem mały teścik, ale program zamiast robić to co trzeba wyłącza się. Funkcja keep_window_open działa na 100%. Oto kod test programu, nie wiem co z nim jest źle.

#include "../../std_lib_facilities.h"

using namespace std;

int main() 
{
	string input = "Czesc222";
	string outputstr;
	int outputdig = 0;
	for (unsigned int i = 0; i<input.size();++i)
		cin.putback(input[i]);
	char sign;    //w tej czesci wkladam rzeczy do strumienia cin

	while(cin.get(sign))  //zeby w tej czesci oszczedzic sobie pisania.
	{
		if (isalpha(sign))  //sprawdza czy sign jest litera
			outputstr += sign;
		else if (isdigit(sign))  //sprawdza czy sign jest liczba
		{
			cin.putback(sign);
			cin >> outputdig;   //jesli tak wklada spowrotem i wczytuje cala liczbe
		}
	}
	cout << "outputstr == " << outputstr << endl;  //testy zeby sie przekonac czy dziala
	cout << "outputdig == " << outputdig << endl;
	keep_window_open();
	return 0;  //nie dziala :)
}
0
  1. Stwórz plik tekstowy, zamieść w nim swoje wejście i w Visual Studio w preferencjach projektu w debugging w command arguments ustaw przekierowanie wejścia na swój plik (< wejscie.txt).
  2. Napisz funkcje, które jako argument biorą istream& i na początku programu stwórz sobie stringa, który będzie zawierał predefiniowane wejście i utwórz istringstream na jego podstawie. Będziesz mógł do takiej funkcji przekazać std::cin albo właśnie ten własny strumień.

Prościej będzie zrobić pierwszą rzecz.

0

Nie za bardzo mi chodziło o takie rozwiązanie. Wolałbym zaczynać z nowymi rzeczami w swojej kolejności, a pliki tekstowe są za kilka rozdziałów. Dzięki za inicjatywę, ale w tym wypadku wolałbym dlaczego to nie działa i czy w ogóle to co mam na myśli jest możliwe.

0

Przeczytałeś chociaż co ci napisałem? Co ma nauka programowania C++ do przekierowania wejścia z pliku? Nic.

No, ale dobra, wiesz lepiej, baw się w uzupełnianie cin.

0

W tym wypadku nie chcę używać pliku. Do czegoś tak prostego musi być "lepsze" rozwiązanie. A więc co jest źle w tym kodzie i czy jest to w ogóle możliwe?

0

Nie jestem pewien co Ty chcesz w ogóle osiągnąć, ale cin nie służy do pobierania tego samego kilka razy.

Jeżeli chcesz wyciągać z wpisanego łańcucha liczby to najpierw wczytaj wszystko a potem ich szukaj. Takie jest moje zdanie.

0

Z dokumentacji wynika, wg mnie, że nie możesz putbackować więcej znaków, niż wczytałeś ze strumienia.

0

putback nie służy do "wstawiania" danych do bufora cin i nie da się tego zrobić. Przez putback możesz "odłożyć" wczytany wcześniej znak (zastąpić go), tak, żeby można było go wczytać jeszcze raz.

Dałem ci dwie najlepsze (i pierwszą, która jest zdecydowanie najłatwiejsza) metody do zrobienia tego, co chcesz zrobić.

0
MakeMeHappy napisał(a)

W tym wypadku nie chcę używać pliku. Do czegoś tak prostego musi być "lepsze" rozwiązanie. A więc co jest źle w tym kodzie i czy jest to w ogóle możliwe?
Przekierowanie strumienia to jest właśnie lepsze rozwiązanie. To nie ma związku z programowanie, a bardziej z uruchamianiem programów.

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