Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zapisanie wyników do pliku przez fstream

Ostatnio zmodyfikowano 2014-02-11 08:47
Autor Wiadomość
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:
C/C++
#include <algorithm>
#include <iostream>
#include <fstream>
using namespace std;
bool permutacja( string a )
{
    int n = a.length();
    int i, j; // indeksy znakow ktore bede zamieniac ze soba miejscami
    while( true ) {
        cout << a << endl;
        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 ] ) 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;
        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
                {
                    cout << "" << endl;
                    cout << "\tUtworzono plik o nazwie \"" + outname + "\"" << endl;
                    cout << "" << endl;
                    string perm( line );
                    sort( perm.begin(), perm.end() ); // posortuj litery
                    cout << "" << endl;
                    cout << "Jesli chcesz zakonczyc wcisnij ENTER";
                    cout << "" << endl;
                    while( true )
                    {
                        if( perm != line ) fout << perm << endl; // jeżeli to nie nazwa pliku
                       
                        if( permutacja( perm ) )
                             fstream( outname.c_str(), ios::out | ios::app );
                       
                        break; // jeżeli brak nastepnej permutacji to koniec
                    }
                }
                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ć
       
    }
}
P-104337
Monika90
» 2014-02-09 22:12:54
W funkcji permutacja brak instrukcji return.

Z kolei to:
C/C++
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.
P-104345
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.
P-104358
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);
P-104360
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ć.
P-104368
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ć.
P-104374
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ć
     }
  }
P-104413
« 1 »
  Strona 1 z 1