Prosta baza danych, problem z zapisem do pliku.

0

Witam, piszę na zadanie prostą bazę danych i mam problem z zapisem danych do pliku. Wg. wszystkich kursów/guide'ów to powinno działać. Jakieś pomysły dlaczego tak nie jest?

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int n; //dana ilosci wpisow
fstream plik;

struct baza
{
    string imie;
    string nazwisko;
    string mail;
    int telefon;
    int fax;
    string miejscowosc;
    string ulica;
    int numer_d;
    int numer_m;
    string kod;
    string poczta;
};

struct baza dane[100];

void otw_plik()
{
    plik.open( "baza.txt", std::ios::in | std::ios::out );
    if( plik.good() == true ) std::cout << "Poprawnie otwarto plik" << std::endl;
    else std::cout << "Wystapil problem z otwarciem pliku" << std::endl;
}

void wczytaj()
{

    while(!plik.eof())
    {
        plik>>dane[n].imie;
        n++;
    }
}


void zapisz()
{
    cout<<dane[0].imie<<endl; // sprawdzanie
    dane[0].imie = "lol";           // czy zmienily sie dane
    cout<<dane[0].imie<<endl; // w tablicy
    for(int i=0;i<n;i++)
    {
        plik<<dane[i].imie;
    }
}

int main()
{
n=0;
otw_plik();
wczytaj();
zapisz();
plik.close();

}
0

Zdefniuj "tak nie jest". Kod wygląda na poprawny. Jakie są w takim razie problemy? Co się faktycznie dzieje?

0

cóż, zawartość pliku się nie zmienia, nic się nie nadpisuje, nic się nie dodaje

0

nikt nie wymyślił o co może chodzić? :/

0

Nie znam zbyt dobrze C++, ale czy to na pewno jest poprawnie?
struct baza dane[100];

Nie powinno być przypadkiem tak:
baza dane[100];
?

0

Przyczyną z pewnością jest to, że po wczytaniu danych obiekt plik ustawia sobie flagę, że jest eof, dlatego nie może zapisać kolejnych informacji.

0

wymylilem pare powodow:

  • Sprawdz sciezke pliku "baza.txt" (Jak sie pomysliles n bedzie rowne 0 i wtedy nic ci sie nie zapisze)
  • osobno w funkcji wczytywania do pliku i zapisywania do pliku dalbym jedno uprawnienie
    ifstream - odczyt z pliku
    ofstream - zapis do plliku
    I po kazdej funkcji dawalbym plik.close();
  • Skoro wpisales using namespace std; to po co wszedzie piszesz std:: (pisales to chyba po to, zeby tego nie robic)
  • czy dane[0].imie zanim zapiszesz pokazuje odpowiednia wartosc?
    Jesli pokazuje dobra wartosc i plik sie dobrze wczytuje to jedyna rzecz moze lezec w petli for. Moze n = 0 i petla nie wykonuje sie ani razu?? Ja w ogole zamiescilbym na poczatku pliku liczbe okreslajaca wartosc n
 
ifstream inFile;
inFile.open("dane.txt");
inFile >> n;
for(int odczyt=0; odczyt<n; odczyt++)
{
     inFile >> dane[odczyt].imie;
}
inFile.close();

Ponadto jak zapisujesz plik to kazdy wyraz oddziel spacja, poniewaz jak wczytujesz wyrazu to wczytujesz identycznie jak cin>> (do napotkania znaku spacja).

ofstream outFile;
outFile.open("dane.txt");
outFile << n;
outFile <<" ";
for(int zapis=0; zapis<n; zapis++)
{
     outFile<<dane[zapis].imie;
     outFile<<" ";
} 
outFile.close();

Plik tekstowy wygladalby mniejwiecej tak:

3 Adam Wojtek Michal

0

A czy przy wczytywaniu pliku plik nie doszedl do konca? ;p Wtedy plik.eof() == true i jak zaczynasz zapisywac warunek !plik.eof() == false i petla która ma ci zapisywać nie zadziała ani razu. Przed każdą funkcją wczytaj() i zapisz() daj funkcję otw_plik(), a po wykonaniu każdej z tych funkcji daj plik.close(). Wtedy wszystko będzie w porządku. Tak w nawiasie jak nie wiesz to eof() ustawia się gdy przy czytaniu pliku napotka się znak '\0' (koniec tekstu)

Przepraszam, MJay już to napisał nie zauważyłem.

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