[c++]"Pętlący" się strumień ?

0

Cześć, mam straszny problem z zapisem do pliku, z którym walczę już od 2 dni, program umożliwia wybór 1 z kilku możliwyh operacji,m.in zapis, poniżej zamieściłam istotne dla problemu fragmenty...

int main()   {
...
program();
return 0;
}

int program()  {
...
cout<<"Tutaj jest menu programu; m. in: x-zapis do pliku";
do{
//----tutaj program sie petli
	cin>>r_w;//typu char
	cout<<r_w<<"*";
//--------------------------
	}
while (r_w!='r' && r_w!='w' && r_w!='x' && r_w!='q' && r_w!='h');//mozliwe opcje menu	

switch(r_w)      
{  
...
   case 'x':
  {  ...
     cin>>p; // p to nazwa pliku w ktorym zapisujemy
     zapisz(p);  break;
   }
}
program();
return 0;
}

int zapisz(char p[50])   {
....
ofstream outfile (p,ios::out);
int ch;
do {
   ch=cin.get();
   outfile.put (ch);
  } while (ch!=EOF);
outfile.close();
return 0;
}

w przypadku pierwszego wywołania oraz powrotu z innych opcji programu jest tak, jak powinno być, a w przypadku powrotu z funkcji zapisu do pliku(ctrl+d) otrzymuję nieskończoną pętlę (ekran pełen ) bez możliwości wpisania czegokolwiek z klawiatury... ( została wprowadzona jedynie w celu testowym... jak w ogóle nie było tej pętli z warunkami && to program się pętlił na wyświetlaniu menu, czyli w tym samym miejscu)
Jeśli testuje fragment z funkcji 'zapisz' osobno, w main tj bez rekurencji (zaraz po zakończeniu zapisu jest koniec programu), wszystko działa bez zarzutu. Jesli zastąpie return 0 przez exit(0) program kończy się zgodnie z oczekiwaniem (ale przeciez nie o to chodzi, zeby był jednorazowy...).
Znajdzie się jakiś dobry człowiek, który zechce mi pomóc?

0

Mimo moich szczerych chęci nie mogę zmusić tego programu do "zapętlenia się" (Win/MinGW)...
Przedstaw najmniejszy, kompilowalny program, który pokazuje problem. Napisz jaki kompilator, system operacyjny posiadasz.

0

Dzięki za zainteresowanie, używam g++ pod linuxem, program zamieszczę wieczorem, bo właśnie wychodzę :d , a wywalenie wszystkiego co się da z programu w mającego prawie 400 linii troszke potrwa (bo jestem jeszcze nowicjuszem w tej materii...). Byłabym wielce zobowiązana za ponowne zainteresowanie tematem. Bardzo przepraszam, że nie odpowiem od razu.
Z poważaniem
olka

0

Najmniejszy (wg mnie...), kompilowalny program, który powoduje zapętlenie:

#include <iostream> 
#include <fstream>
using namespace std;

int pisz(char p[50])
{
char powrot;
cout<<"Wpisz tekst i wcisnij ctrl + d"<<endl;
ofstream outfile (p,ios::out);
int ch;
do
 {
    ch=cin.get();
    outfile.put (ch);
  } while (ch!=EOF);
  outfile.close();
    return 0;
}
    
int pomoc()
{
char powrot;
cout<<"tutaj wyswietla sie help do programu"<<endl;
cout<<   "Powrot do glownego menu ? [y] "; 
    while (powrot!='y')
 cin>>powrot;
return 0;
}   

int program()
{
char r_w, p[50];
cout<<"Wybierz akcje :"<<endl;
cout<<"x - utworz"<<endl;
cout<<" h - pomoc"<<endl;
cout<<" q - wyjscie z programu"<<endl; 
cout<<"Twoj wybor:";
do  {  cin>>r_w;
 }
while (r_w!='r' && r_w!='w' && r_w!='x' && r_w!='q' && r_w!='h'); 
switch(r_w)     
{
case 'x':{
       cout<<"\n\t\t\t Podaj nazwe pliku";
       cin>>p;
       pisz(p);
  break;
  }
case 'q':{
  exit(0);break;
  }
case  'h':{
   pomoc(); break;
   }  

 }
 program();
 return 0;
}  
 
int main()
{
program();
return 0;
}
0

Hmmm, akurat nie mam dostępu do kompilatora... Coś może i jest nie tak z tym programem przez to wczytywanie z cin i zapis do pliku, i przerwanie przez ctrl+d...
Daj może

cin.sync();

przed wczytywaniem klawisza z cin, tam gdzie jest menu.

0

Niestety, cin.sync() nie pomaga niezależnie czy wstawiony w funkcji pisz() po zamknięciu pliku, czy w funkcji program(), zarówno przed pętlą jak i w niej samej...
Może jakoś inaczej kończyć zapis do pliku?, tylko że żadne znaki nie wchodzą w rachubę... Ewantualnie jakieś inne klawisze, ale nie wiem jak to zrobić... :-/

Ale wielkie dzięki za chęć pomocy
olka

0

Problem rozwiązany - może nie najbardziej elegancko, ale zawsze...

ofstream outfile (p);  
  while((ch = cin.get()) != '\t') 
  {
      outfile.put(ch);       
   }

Jeszcze raz dziękuję za próbę pomocy

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