olka Opublikowano 9 Maja 2005 Zgłoś Opublikowano 9 Maja 2005 (edytowane) 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 9 Maja 2005 przez olka Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 9 Maja 2005 Zgłoś Opublikowano 9 Maja 2005 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(). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 9 Maja 2005 Zgłoś Opublikowano 9 Maja 2005 (edytowane) 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 9 Maja 2005 przez razor1 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
olka Opublikowano 9 Maja 2005 Zgłoś Opublikowano 9 Maja 2005 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...