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

No i niby jak zabraniasz zeby ktos zrobil sobie takie cos?

std::fstream fs;
fs.open ("test.txt", std::fstream::in | std::fstream::out | std::fstream::app);

fs << " more lorem ipsum";

fs.close();

Albo co jezeli odpale kolejny thread i wywolam ten Twoj singleton? na 99% sie wywali a na 100% zle obslugujesz plik gdy bedzie wiele watkow takze Twoje zabezpieczenie jest po prostu slabe i tylko zaciemnia kod

Przede wszystkim skoro ma byc to baza danych to uzylbym gotowych rzeczy typu sqllite. Przy polaczeniu z baza, singleton ma sens (choc tez nie zawsze), ale dziala inaczej niz otwieranie pliku i zapisywanie do niego

Powinienes

  1. Miec consta jezeli chodzi o nazwe pliku... chociaz posiadanie jednego pliku jest troche bez sensu (co jesli dojda Ci nowe dane? Bedziesz rozrastal jeden plik? duzo lepiej jakbys uzyl sqllite czy innej bazy)
  2. Jezeli chcesz stworzyc sobie nowy obiekt to nie ma problemu by rozne obiekty pokazywaly na jeden plik. Uzyj mutexa by kilka obiektow nie przekszadzalo sobie w zapisywaniu/odczytywaniu. Akuratnie przy pliku nie zyskujesz aboslutnie NIC ze bedzie jedna instancja pokazujaca na plik. Za to tracisz na tym ze masz static w kodzie + obiekty globalne (poznie bedziesz sie dziwil, ze cos jest inicjalizowane w sposob ktorego nie bedziesz rozumial...)
  3. Skoro i tak masz dwie klasy (jedna tworzy a druga obsluguje) to juz w tej chwili tworzysz mocna zaleznosc od siebie (a co jezeli w przyszlosci bedziesz chcial zamienic plik na cos innego lub rozbudowac?) Powinienes napiasc jakis interfejs (klasa abstrakcyjna) i "przeniesc zaleznosc do interfejsu".

Singleton tutaj (ktory zapewne jest po prostu staticiem i sprawdzasz czy istnieje) nic Ci nie wnosi do projektu

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