Prosta baza danych, problem z zapisem do pliku.

Prosta baza danych, problem z zapisem do pliku.
tariel36
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 8 lat
  • Postów:92
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?

Kopiuj
#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();

}
edytowany 2x, ostatnio: tariel36
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
tariel36
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 8 lat
  • Postów:92
0

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

tariel36
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 8 lat
  • Postów:92
0

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

SI
  • Rejestracja:prawie 16 lat
  • Ostatnio:około 3 lata
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];
?

MJ
obojętne to jest.
SI
ok będę wiedział na przyszłość
MJ
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 10 lat
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.


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)
edytowany 1x, ostatnio: MJay
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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
Kopiuj
 
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).

Kopiuj
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

edytowany 1x, ostatnio: gswidwa
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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.

edytowany 2x, ostatnio: gswidwa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.