nadużywanie strumienia cin.

Odpowiedz Nowy wątek
2011-09-03 23:34
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 :)
}

Pozostało 580 znaków

2011-09-03 23:41
Rev
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.


edytowany 1x, ostatnio: Rev, 2011-09-03 23:42

Pozostało 580 znaków

2011-09-03 23:51
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.

Pozostało 580 znaków

2011-09-03 23:56
Rev
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.


Pozostało 580 znaków

2011-09-03 23:58
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?

Pozostało 580 znaków

2011-09-04 00:11
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.


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-09-04 00:13
0

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


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
pbackfail spróbuje to naprawić, ale nie musi mu się udać. - Endrju 2011-09-04 00:16

Pozostało 580 znaków

2011-09-04 00:14
Rev
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ć.


Pozostało 580 znaków

2011-09-04 01:46
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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