Skocz do zawartości
olka

[c++] "pętlący Się" Strumień ?

Rekomendowane odpowiedzi

Cześć, postanowiłam sobie ostatnio, że zacznę uczyć się C++ i postanowiłam napisać programik, który m. in. zapisuje do pliku znaki wprowadzone z klawiatury. Wszystko pięknie działa, inne opcje są bez zarzutu, tylko po zakończeniu pliku [ctrl + D] program wpada w dziwną pętlę, w ogóle nie reagując na wprowadzane z klawiatury litery.

Czy znalazłby się ktoś tak uprzejmy, żeby mi pomóc? Przegooglałam już chyba wszystkie większe kursy w języku polskim i angielskim i nie znalazłam nic na ten temat...

Poniżej zamieszczam najkrótszą wersję programu, z której można jeszcze wykumać o co chodzi, kompilowalną i powodującą zapętlenie

PHP

#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:";

//--tutaj następuje zapętlenie po powrocie z funkcji pisz

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;

}

wstawienie cin.sync(); zarówno po zamknięciu pliku w funkcji pisz(); ani przed pobraniem znaku przez cin w program() nie pomaga.

 

ps. używam kompilatora g++ pod linuxem

ps.2 Proszę zważyć, że jestem raczej osobą początkującą w programowaniu

Edytowane przez olka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

PHP

do

{

ch=cin.get();

outfile.put (ch);

}

while (ch!=EOF);

ten warunek jest bez sensu bo co to wogóle znaczy "dopuki ch będzie różne od EOF" ???

to by może by i służyło gdyby tu codziło o pobieranie z pliku np plik.get(ch), ale tu jest bez sensu i nigdy nie zostanie spełnione , to jest przyczyna tego zapentlenia.

 

powinno być np. tak.

 

PHP

do

{

ch=cin.get();

outfile.put (ch);

}

while (ch!='\t');

 

wtedy do czasu nienaciśnięcia tabulatora kiedy sturmień cin.get() nie zostanie oprózniony (czyli dopuki nie naciśniesz enter) doputy ta pental będzie w obiegu.

mozna też zastosować getch() (strumień niebuforowany) z biblioteki conio.h w przypadku tego programu znacznie lepszy niż buforowany cin.get().

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A tak na przyszłośc to pisz swoje programy czytelnie z komentarzami , wcięciami , przejrzyście bez "oszczędzania" na liniach, pisz main() na górze i także deklaracje funkcji na górze ( TO NIE JEST C ) bo ciężko sie połapać w cudzym i jeszcze niechlujnym kodzie.

 

Ten program może mieć ludzką twarz jabym go zrobił na superszybkiego tak:

(można go zrobić na wiele sposobów)

PHP

#include <iostream>

#include <fstream>

#include <conio.h> // jak nie ma conio to wykomentować

using namespace std;

 

int pisz(char p[50]);

int pomoc();

int program ();

 

//------------------------------------------------------------------------------

int main()

{

program();

return 0;

}

//------------------------------------------------------------------------------

int pisz(char p[50])

{

char powrot , ch ;

cout<<"Wpisz tekst i wcisnij enter"<<endl;

ofstream outfile (p);

/*

while((ch = cin.get()) != '\t') // tabulator kończy, strumień buforowany

{

outfile.put(ch);  

//outfile << ch; // lub tak  

}

*/

while((ch = getch()) != 13) // Enter kończy od razu, strumien niebufor.

{

cout << ch; // ponieważ strumień niebuforowany to wypada to wyświetlić

outfile.put(ch);

}

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 p[50];

char r_w;

 

do

{

system("cls");  // dla windows , lub clear zamiast cls  

cout<<"Wybierz akcje :"<<endl;

cout<<"x - utworz"<<endl;

cout<<" h - pomoc"<<endl;

cout<<" q - wyjscie z programu"<<endl;

cout<<"Twoj wybor:";

 

cin>>r_w;

 

switch(r_w)

{

 case 'x':

 cout<<"\n\t\t\t Podaj nazwe pliku";

 cin>>p;

 pisz(p);

 break;

 case 'q':

 exit(1);

 break;

 case 'h':

pomoc();

break;  

}

}

while (1);

 

return 0;

}

//------------------------------------------------------------------------------

Edytowane przez razor1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wow DZIAŁĄ! , dzięki wielkie, temat ten otwierałam już na 2 innych forach, ale nikt nie odpisał mi nic, co by działało. Jesteś wielki !

 

Przepraszam, że tak ścieśniłam kod. Sądziłam, że to nieprzyzwoite zamieszczać taki długi post, którego i tak nie przeczyta. Kajam się, że był to błąd.

A co do pętli z EOF - miałoby to znaczy: że powtarzaj tak długo, aż wpiszę znak końca pliku (ctrl + D), tak wyczytałam na stronie kursu jakiegoś uniwerku amerykańskiego...

 

Stokrotne dzięki, z poważaniem

olka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...