zwracanie znaku do wczytania

0

Piszę program, który ma z wejścia wczytać SYMBOL(który jest nowym typem danych) i zakończyć się w przypadku podania na wejście znaku CTRL+D.

Próbowałem zrobić coś takiego przy pomocy funkcji getch() i ungetch().

Znak co prawda jest pobierany przez funkcję getch() i "znika" z terminala ale funkcja ungetch() już go tam nie wrzuca.
Chciałbym, żeby było to tak zrobione, żebym mógł wprowadzić coś takiego: a+b=c (wszystko jest już oprogramowane, z wyjątkiem tego, kiedy "a" nie jest symbolem tylko znakiem CTRL+D) i najpierw zostałby wczytany znak a i jeśli nie jest on CTRL+D to zostaje zwrócony i następnie zostaje jakby znowu wczytany tylko, że tym razem do zmiennej, która jest typu SYMBOL a nie jak w pierwszym przypadku char.

Ktoś ma pomysł i może mnie naprowadzić?

1

Potrzebujesz zwykłe prymitywne: while(cin>>value) { }
Z tym że dla SYMBOL musisz poprawnie zrealizować: istream &operator>>(istream &in,SYMBOL &s)

0

Jeśli zrobię coś takiego

 while(cin>>SYMBOL)

Jak dobrze rozumiem, będzie się wykonywało tylko raz kiedy wczytamy SYMBOL a kilka razy, aż nie dojdziemy do SYMBOLu kiedy podamy coś innego. Ale chodziło mi o to, że program ma sam rozróżnić czy to co dajemy na wejściu jest SYMBOLEM czy znakiem. Ew jak sprawdzić jaki był kod znaku, który wywołał, że cin>>SYMBOL

zwróciło 0?
0

Piszesz że SYMBOL to typ danych, czy uważasz że takie coś: while(cin>>int) {} przejdzie?
cin>>value zwróci false wtedy kiedy odczyt się nie powiódł np w związku z naciśnięciem <Ctrl+D>

0

tę część rozumiem, przez pisanie SYMBOL miałem na myśli, że podajemy coś, co jest rzeczywiście SYMBOLEM, chodzi o to, że program ma się przerwać tylko wtedy, kiedy podamy CTRL+D a nie między innymi wtedy. W innych wypadkach program wypisuje, że podane błędne dane.

1
while(cin>>value) {}
if(cin.eof()) cout<<"<ctrl+D>"<<endl;
else cout<<"nie udało się wczytać"<<endl;
0

Problem w tym, że eof daje mi CTRL+C a nie CTRL+D

0

Nie, <ctrl-C> przerywa program definitywnie, nie ma już dalej żadnego odczytu. Owszem można zmienić tak aby program nie reagował na <ctrl-C>

0

Kiedy daje CTRL+D przy kodzie, który dałeś wyżej wyskakuje mi "nie udało się wczytać" a przy CTRL+C na ułamek sekundy pokazuje się "<ctrl+D>"

0

faktycznie, dzięki za pomoc.
Mam jednak jeszcze jeden problem z działaniem

cin.eof()

Czasami to działa a czasami nie :P
Kod jest trochę długi, więc przesyłam w załączniku.
Problem polega na tym, że kiedy zaraz po uruchomieniu programu wpisuje CTRL+D wyskakuje "Nieprawidłowy pierwszy argument" ale kiedy wcześniej dam np. a+b=e i następnie CTRL+D to program prawidłowo się kończy.
Od czego to zależy, że raz działa tak a raz tak?
P.S. Symbol.cpp jest nagłówkiem ale nie można dołączyć *.h. Cały kod jest fragmentem ćwiczenia, więc pojawiają się funkcje dodaj i później przeciążenie operatora z tą funkcją zamiast samego przeciążenia, proszę nie krytykować :>

1
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  3. Używaj angielskiego nazewnictwa: http://4programmers.net/Forum/1208091
  4. Zamiast ignore() lepiej daj: while(cin.get()!='\n') {}
  5. Zmień całość na:
if(cin>>arg1>>op>>arg2>>eq)
  {
   ...
  }
else if(cin.eof()) break;
else
  {
   cout<<"Err"<<endl;
   cin.clear();
   while(cin.get()!='\n') {}
  }
  1. Debuger do ręki i szukać.
0

Na windowsie jakoś to dziwnie nie działa<raz działa raz nie> na linuxie działa tak jak powinno.
Jeszcze jedno pytanie, czy w takim rozwiązaniu sprawy da się w jakiś sposób rozdzielić przy którym wczytaniu wyskakuje błąd?
Edit: Okazuje się, że moje wcześniejsze rozwiązanie również działa na linuxie a po przesłaniu na serwer znowu nie działa i chyba problem leży w tym, że CTRL+D nie daje EOF po stronie serwera.
Dzięki bardzo za pomoc.

0

Pod windows to nie <ctrl-D> tylko <ctrl-Z>

0

Dzięki bardzo za pomoc przy tym zadaniu.
Rozumiem, że nie da rozróżnić w którym momencie wywaliło błąd?

0

Nie, nie da się, z tym że jaka cię różnica czy błąd był przy pierwszej zmiennej czy przy trzeciej?
Tak czy owak wyrażenie nie jest poprawne.

0

Prawda, chodziło o to tylko, że w zadaniu było napisane, co było nie tak zrobione.
W każdym razie dzięki wielkie.

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