zapisywanie w nowych plikach c++

0

Witam, mam problem i pytanie.
Problem, polega na tym, że mam taką metodę i zamysł był taki, aby przy każdym obrocie pętli program zapisywał dane do nowego pliku o nazwie podanej wyżej w string nazwa. Jednak tak to nie działa, bo faktycznie zapisuje w nowym pliku, ale tylko przy ponownym otworzeniu programu. Może ktoś podpowiedzieć jak to naprawić?
Pytanie natomiast mam takie, jak zrobić, aby te pliki zapisywały się w nowym pliku, który będzie w nowo utworzonym folderze, którego lokalizacja to będzie na przykład bieżący folder/zapisy?

    public:  void zapisz()
    {
        int koniec;
        fstream zapis;
        while(true)
        {

        cout<<"Podaj nazwe: "<<endl;
        cin>>nazwa;
        zapis<<nazwa<<endl;
        cout<<"Podaj kod: " <<endl;
        cin>>kod;
        zapis<<kod<<endl;
        cout<<"podaj cene"<<endl;
        cin>>cena;
        zapis<<cena<<endl;
        zapis.open(nazwa.c_str(), ios::out|ios::app);

        cout<<"1.Zakoncz"<<endl;
        cout<<"2.kontynuuj"<<endl;
        cin>>koniec;
        if(koniec == 1)
        {
            zapis.close();
            break;
        }
        else if(koniec == 2)
        {
            cout<<"Nowa faktura: "<<endl;
        }
        else
        {
            while(koniec!=1 || koniec !=2)
            {
            cout<<"zly klawisz, jeszcze raz"<<endl;
            cin>>koniec;
            }
        }
        }
1
        zapis<<cena<<endl;
        zapis.open(nazwa.c_str(), ios::out|ios::app);

To w ogóle działa?

0

@kq:Tak, działa. jeśli chodzi o to, że zapis.open jest pod podanymi parametrami, to jest to wynik prób i kombinowania czemu nie chce działać.

0

Chodzi o to, że pierw próbujesz zapisywać, a potem dopiero otwierasz plik do zapisu.

0

@kq: No tak o to mi chodziło, kombinowałem. wcześniej było nad i było tak samo.

1

Aby nie było problemu otwieraj zawsze przy deklaracji:

        ofstream zapis(nazwa.c_str(),ios::out|ios::app);

Oraz warto używać ofstream i ifstream jeżeli otwieranie jest w trybie standardowym.
Np do odczytu/zapisu:

        ifstream srcFile(srcFileName.c_str());
        ofstream dstFile(dstFileName.c_str());
2

lepiej robić tak:

class MojaKlasa
{
public:
     std::ostream& zapiszW(std::ostream& strumien) const { 
        ....
        return strumien;
     }

     bool zapiszWPliku(const std::string& nazwaPliku) const {
         std::ofstream f{nazwaPliku};
         return f && zapiszW(f);
     }

     bool dopiszDoPliku(const std::string& nazwaPliku) const {
         std::ofstream f{nazwaPliku, std::ios::app};
         return f && zapiszW(f);
     }
};

Zaleta jest taka, że można napisać test do zapiszW bez zapisywania czegokolwiek na dysku (dzięki czemu łatwo i szybko się testuje).
Łatwiej też obsługuje się błędy.

0

@MarekR22: tym sposobem nadal tylko jeden plik powstaje i jeden zapis. Może to być przez to, że w mainie jest tylko jeden obiekt?

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