Wyczyszczenie pliku po pobraniu jego zawartości

0

Witam.
W jaki sposób można wyczyścić zawartość pliku, ale dopiero po pobraniu jego zawartości na przykład do vectora obiektów, w którym może użytkownik modyfikować zmieniać dane? Na koniec modyfikacji gdy użytkownik kończy działanie, program ma zapisać zmienione dane do tego samego, ale już pustego pliku.
Czyli w takiej kolejności:
Pobranie danych do np. vectora,
wyczyszczenie pliku,
modyfikacja danych w vectorze przez użytkownika,
zakończenie działania programu i zapis do pliku danych z vectora

5
{
    ifstream f;
    f.open(name);
    suck(f);
}
{
    ofstream f;
    f.open(name, ios::trunc);
}
0

A w jakiej bibliotece jest suck()?
Obecnie kawałek mojego kodu odpowiadający za eksportowanie i importowanie danych wygląda tak:

void obsluga_Pliku::EksportujDoNowegoPustegoPliku()
{
    Plik::getPlik().ofstreamPlik.open(Plik::getPlik().zwroc_nazwe_pliku());
    obsluga_Pliku::getObsluga_Pliku().Eksportuj();
    Plik::getPlik().ofstreamPlik.close();
}
void obsluga_Pliku::ImportujZPlikuDoPustejListy()
{
    Plik::getPlik().ifstreamPlik.open(Plik::getPlik().zwroc_nazwe_pliku());
    obsluga_Pliku::getObsluga_Pliku().Importuj();
    Plik::getPlik().ifstreamPlik.close();
}
0

Wywal te ofstreamPlik oraz ifstreamPlik na rzecz zmiennych lokalnych a problem zniknie.

2

suck to pseudokod, funkcja obsługująca wczytany plik.

Ten Twój kod to jakiś straszny overengineering powiązany z dziwnymi rozwiązaniami.

0

Dobra. Udało się.
Plik od importu i eksportu wygląda tak:

#include "Plik.h"
ifstream iPlik;
ofstream oPlik;
string Plik::zwroc_nazwe_pliku()
{
    return nazwa_pliku;
}
void obsluga_Pliku::Eksportuj()
{
    if(oPlik.good()==true)
    {
        UdaloSieOtworzycPlik(1,27,Plik::getPlik().zwroc_nazwe_pliku());

        for(vector<Pracownik*>::iterator it = Pracownik::getPracownik().pracownicy.begin();it!=Pracownik::getPracownik().pracownicy.end();++it)
        {
            oPlik<<"#\n"<<(*it)->zwrocImie()+"\n"+(*it)->zwrocNazwisko()+"\n";
            cout<<(*it)->zwrocImie()+" "+(*it)->zwrocNazwisko()+"\n";
        }
    }
    else
    {
        nieUdaloSieOtworzycPliku(5,27,Plik::getPlik().zwroc_nazwe_pliku());
        narzedzia::getNarzedzia().mygetch();
    }
}
void obsluga_Pliku::Importuj()
{
    string tekst,imie,nazwisko;
    if(iPlik.good()==true)
    {
        UdaloSieOtworzycPlik(1,27,Plik::getPlik().zwroc_nazwe_pliku());
        getline(iPlik, tekst);
        if(iPlik==NULL)
        {
            narzedzia::getNarzedzia().gotoxy(5,27);cout<<"plik jest pusty";
        }
        else
        {
            narzedzia::getNarzedzia().gotoxy(5,27);cout<<"plik nie jest pusty";
            iPlik.seekg(0);
            while(!iPlik.eof())
            {
                getline(iPlik,tekst);
                if(tekst=="#")
                {
                    getline(iPlik,tekst);
                    if(tekst!="#"&&tekst!=" ")
                    {
                        imie=tekst;
                        getline(iPlik,tekst);
                        if(tekst!="#"&&tekst!=" ")
                        {
                            nazwisko=tekst;
                            obsluga_Pracownika::getObsluga_Pracownika().dodajPracownika(imie,nazwisko);
                        }
                    }
                }
            }
        }
        }
    else
    {
        nieUdaloSieOtworzycPliku(1,27,Plik::getPlik().zwroc_nazwe_pliku());
        narzedzia::getNarzedzia().mygetch();
    }
}
void obsluga_Pliku::EksportujDoNowegoPustegoPliku()
{
    oPlik.open(Plik::getPlik().zwroc_nazwe_pliku(),std::ios_base::out|std::ios_base::trunc);
    obsluga_Pliku::getObsluga_Pliku().Eksportuj();
    oPlik.close();
}
void obsluga_Pliku::ImportujZPlikuDoPustejListy()
{
    iPlik.open(Plik::getPlik().zwroc_nazwe_pliku(),std::ios_base::in);
    obsluga_Pliku::getObsluga_Pliku().Importuj();
    iPlik.close();
}
Plik::Plik(){}
Plik::~Plik(){}
Plik &Plik::getPlik()
{
    static Plik plik;
    return plik;
}
obsluga_Pliku::obsluga_Pliku(){}
obsluga_Pliku::~obsluga_Pliku(){}
obsluga_Pliku &obsluga_Pliku::getObsluga_Pliku()
{
    static obsluga_Pliku plik;
    return plik;
}
4

Pełno tu kodu z polskimi nazwami, korzystającego z fatalnych antywzorców typu singleton/zmienne globalne, magicznych numerków, zbędnego kodu i dużych zagnieżdżeń. Wywaliłbym całość i napisał od nowa, tym razem dobrze.

0

Najważniejsze że działa. Z numerkami fakt. Muszę coś z nimi zrobić. Korepetytor też mi mówił że nie powinienem wstawiać liczb do kodu. Zdefiniować je muszę jako stałe. Singleton akurat mi potrzebny żeby nie utworzyć kilku takich samych obiektów. Chyba że masz jakiś inny pomysł, żeby powstała tylko jedna instancja obiektu, bez możliwości utworzenia następnych.

2

zle podchodzisz do problemu.

Dlaczego ma byc tylko jedna instacja obiektu? Wytlumacz nam wszystkim, dlaczego tylko jedna instancja? Zapewne probujesz przeskoczyc przepasc nie wiedzac ze jest most po ktorym mozna przejechac czolgiem.

I nie jest najwazniejsze, ze dziala. Ale to zrozumiesz jak nabierzesz troche doswiadczenia...

0

Mój program operuje tylko na jednym pliku tekstowym lista_pracowników.txt. I tylko na tym jednym pliku ma na tą chwilę operować. Nazwa pliku "lista_pracowników.txt" jest ustawiona na stałe. Po co mi kilka obiektów o tym samym typie do działanie z jednym i tym samym plikiem skoro jeden wystarczy.
To że mam mało doświadczenia to akurat prawda.
Mam klasę Plik która jest odpowiedzialna za utworzenie jednego obiektu, a od obsługi pliku mam drugą klasę obsługa_Pliku. Tylko muszę teraz chyba i tak pokombinować jak ifstream i ofstream wsadzić jako publiczne lub prywatne zmienne do klasy Pik. Takie zabezpieczenie. Żebym czegoś nie popsuł.
Same zmienne mam wszędzie powsadzane do plików h, a same funkcje/metody w .cpp

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