mmatkowski1 Temat założony przez niniejszego użytkownika |
Zapisanie wyników do pliku przez fstream » 2014-02-09 20:49:41 Witam. Posiadam taki problem z moim programem, że zamiast zapisać mi wyników do plików tworzonych wcześniej zapisuje mi je do konsoli a pliki pozostają puste bez żadnych danych. Proszę o pomoc. Pozdrawiam. Kod programu: #include <algorithm> #include <iostream> #include <fstream> using namespace std; bool permutacja( string a ) { int n = a.length(); int i, j; while( true ) { cout << a << endl; i = n - 1; while( i > 0 && a[ i - 1 ] >= a[ i ] ) i--; if( i == 0 ) break; j = i; while( j < n && a[ j ] > a[ i - 1 ] ) j++; j--; swap( a[ i - 1 ], a[ j ] ); reverse( a.begin() + i, a.end() ); } }
int main() { while( true ) { int i, j; cout << "Podaj nazwe pliku wraz z rozszerzeniem : "; string name; getline( cin, name ); if( !name.length() ) break; ifstream fin( name.c_str() ); if( fin ) { string line; while( getline( fin, line ) ) { string outname( line + ".txt" ); ofstream fout( outname.c_str() ); if( fout ) { cout << "" << endl; cout << "\tUtworzono plik o nazwie \"" + outname + "\"" << endl; cout << "" << endl; string perm( line ); sort( perm.begin(), perm.end() ); cout << "" << endl; cout << "Jesli chcesz zakonczyc wcisnij ENTER"; cout << "" << endl; while( true ) { if( perm != line ) fout << perm << endl; if( permutacja( perm ) ) fstream( outname.c_str(), ios::out | ios::app ); break; } } else cout << "Plik \"" + outname + "\" nie daje sie stworzyć" << endl << endl; } cout << endl; } else cout << "Nie mozna otworzyc pliku \"" + name + "\"" << endl << endl; } } |
|
Monika90 |
» 2014-02-09 22:12:54 W funkcji permutacja brak instrukcji return. Z kolei to: if( permutacja( perm ) ) fstream( outname.c_str(), ios::out | ios::app );
break;
tworzy tymczasowy obiekt typu fstream nie wiadomo po co, nastepnie break przerywa pętlę zawsze po pierwszej iteracji. |
|
mmatkowski1 Temat założony przez niniejszego użytkownika |
» 2014-02-09 22:58:32 A jak miałaby wyglądać ta instrukcja return i w którym miejscu ją umieścić bo nie jestem za bardzo wtajemniczony w programowanie. |
|
Monika90 |
» 2014-02-09 23:23:14 W takiej sytuacji sugeruję: 1. zmienić typ zwracany funkcji permutacja na void 2. przekazywać plik do tej funkcji przez referencję i zapisywać permutacje do tego pliku zamiast do cout 3. Z main usunąć najbardziej wewnętrzną pętle while (true) i zamiast niej po prostu raz wywołać permutacja(fout, perm); |
|
mmatkowski1 Temat założony przez niniejszego użytkownika |
» 2014-02-10 11:48:36 A jak wykonać 2 krok? Ponieważ 1 i 3 krok jeszcze chyba będę umiał zrobić. |
|
mmatkowski1 Temat założony przez niniejszego użytkownika |
» 2014-02-10 13:46:49 Non stop mi nie wychodzi. Jakby miał wyglądać kod tego zapisu bo już naprawdę nie wiem gdzie i jak go umieścić. |
|
mmatkowski1 Temat założony przez niniejszego użytkownika |
» 2014-02-11 08:47:17 Teraz nie wyświetla mi już na konsoli wyników, ale nadal nie wiem gdzie umieścić funkcję do zapisu danych i o jakiej nazwie by to miało być.
Oto poprawiony kod: #include <algorithm> #include <iostream> #include <fstream> using namespace std; void permutacja (string a) { int n = a.length(); int i,j; // indeksy znakow ktore bede zamieniac ze soba miejscami while (true) { i = n-1; // Od końca słowa idąc w lewo: // znajduje taki znak ze poprzednik jest od niego mniejszy: while (i>0 && a[i-1]>=a) i--; // dopóki poprzedni znak jest wiekszy/rowny biezacemu to idź w lewo if (i==0) break; // jeżeli nie na już znaków które można przestawić, to koniec
// będę przestawiać POPRZEDNIKA największego znaku: a[i-1] // zamienię go z NAJMNIEJSZYM znakiem większym od niego, // który stoi z jego prawej strony j = i; while (j<n && a[j]>a[i-1]) j++; // szukam NAJMNIEJSZEGO znaku WIEKSZEGO od a[i-1] j--; swap(a[i-1],a[j]); // zamieniam znaki miejscami reverse(a.begin()+i, a.end()); // przywracam porządek na prawo od i } }
int main() { while(true) { int i,j; cout<<"Podaj nazwe pliku wraz z rozszerzeniem : "; string name; fstream outname; getline(cin,name); // wczytaj nazwe if(!name.length()) break; // koniec jeżeli pusty plik ifstream fin(name.c_str()); // otwieramy plik if(fin) // jeżeli się udało otworzyć { string line; while(getline(fin,line)) // wczytaj wiersz { string outname(line+".txt"); // złóź nazwę ofstream fout(outname.c_str()); // stwórz plik if(fout) // jeżeli udało się stworzyć plik { string perm(line); sort(perm.begin(),perm.end()); // posortuj litery permutacja(perm); cout<<""<<endl; cout<<"\tUtworzono plik o nazwie \""+outname+"\""<<endl; cout<<""<<endl; cout<<""<<endl; cout<<"Jesli chcesz zakonczyc wcisnij ENTER"; cout<<""<<endl; } else cout<<"Plik \""+outname+"\" nie daje sie stworzyć"<<endl<<endl; // jeżeli NIE udało się stworzyć plik } cout<<endl; } else cout<<"Nie mozna otworzyc pliku \""+name+"\""<<endl<<endl; // jeżeli NIE udało się otworzyć } } |
|
« 1 » |