Prosta baza danych C++

0

Witam serdecznie,

Potrzebuję pomocy z zrealizowaniem prostej bazy danych w c++.
Mam plik csv, do którego wpisują mi się rekordy zgodnie z założeniami, ale za nic nie mogę przemęczyć tematu dodawania kolejnych rekordów z nowymi ID. Nie wiem jak to zrealizować aby było to w najprostszej formie, bez gmatwania.
Nie wiem po prostu jak wyszukać ostatnie ID. Do tego muszę edytować/wyświetlać dane pod konkretnym ID.
Pomocy, nie wiem jak się za to zabrać bo przekopałem już fora i żaden z kodów mnie nie satysfakcjonuje... :/

plik.open("plik.csv", ios_base::out | ios_base::app | ios_base::ate);

W ten sposób ustawiam wpisywanie kolejnych rekordów, są one oddzielone średnikami, a w ostatniej komórce "\r\n" jednakże wpisują mi się one co 2 linijki.
Nie wiem czy mam to robić na zasadzie listy jednokierunkowej(podobne rozwiązania widziałem), czy jest jakiś inny, lepszy sposób?

0
#include <iostream>
#include <string>
#include <windows.h>//sleep
#include <conio.h>//getch
#include <locale.h>//jezyk
#include <fstream>// obsluga plikow

using namespace std;

struct
{
    unsigned int id;
    string tytul;
    string autor[5];
    string isbn;
    unsigned int dostepnosc;
}katalog;

void zapis_ksiazki_do_katalogu(){

fstream katalog_ksiazek;

katalog_ksiazek.open("katalog_ksiazek.csv", ios_base::out | ios_base::app | ios_base::ate);

if(katalog_ksiazek.good()==true)
{
    int i=1, id=0;
    char wiecej;
    katalog.dostepnosc=1;//zawsze nowo dodana ksiazka jest dostepna

    cout<<"\t\t\tPodaj dane książki.\n";

    cout << "\n\nTytuł: ";
    getline(cin,katalog.tytul); //TYTUŁ KSIĄŻKI łącznie ze spacjami

    cout << "\nAutor[" << i << "]: "; //AUTOR KSIĄŻKI
    getline(cin,katalog.autor[i++]);
    cout << "Czy chcesz dodać kolejnego autora?\n\n[T/N]: ";

    wiecej=getch();
    while(wiecej!='T' && wiecej!='N' && wiecej!='t' && wiecej!='n')
        {
        system("cls");
        cout << "\n\n\t\t\tPodaj poprawne dane!\n\n\nCzy chcesz dodać kolejnego autora?\n\n[T/N]: ";
        wiecej=getch();
        }

    katalog_ksiazek << katalog.id << ";" << katalog.tytul << ";" << katalog.autor[i-1] << "@";

    while(wiecej=='T' || wiecej=='t')
    {
        cout << "\nAutor[" << i << "]: "; //AUTOR KSIĄŻKI

        getline(cin,katalog.autor[i++]);
        katalog_ksiazek << katalog.autor[i-1] << "@";
        cout << "Czy chcesz dodać kolejnego autora[T/N]?";

        wiecej=getch();
        if(wiecej=='T' || wiecej=='t')
            wiecej='T';
        else
        {
                wiecej='N';
                katalog_ksiazek << ";";
        }
    }//koniec autorów

    cout << "\n\nISBN: ";
    getline(cin,katalog.isbn); //isbn
    katalog_ksiazek << katalog.isbn << ";";
    katalog_ksiazek << katalog.dostepnosc << ";\r\n";
}

    else
    {
        system("cls");
        cout << "Błąd podczas otwierania pliku.\n";
        Sleep(2000);
    }

}

int main()
{
    setlocale(LC_ALL, "Polish");
    zapis_ksiazki_do_katalogu();
    return 0;
}

Chciałem tego uniknąć, aby nie można było tego ot tak wygooglować, gdyż może to sprawdzać mój szanowny wykładowca.
No ale nic! :) Potrzebuję pomocy.

0

Zacznij od zdefiniowania typu rekordu.

struct Katalog
{
    unsigned int id;
    string tytul;
    string autor[5];
    string isbn;
    unsigned int dostepnosc;
};

Katalog katalog;

Potem zmień zmienną "wiecej" na bool:

bool wiecej;

http://www.learncpp.com/cpp-tutorial/26-boolean-values/

i dodaj funkcję:

void dodaj_ksiazke(fstream katalog_ksiazek, const Katalog &rekord);

A następnie zaimplementuj funkcję:

void wczytaj_ksiazki(fstream katalog_ksiazek, vector<Katalog> &ksiazki);

Po tym już będzie z górki i szansa na ocenę > 1.

1
#include <iostream>
#include <string>
using namespace std;

template <typename T>
struct Comparable {
  enum class CompareUnit {
    Lower  = -1,
    Equal  =  0,
    Higher =  1
  };

  bool operator==(const T& other) { return compare(other) == CompareUnit::Equal ; }
  bool operator!=(const T& other) { return compare(other) != CompareUnit::Equal ; }
  bool operator< (const T& other) { return compare(other) == CompareUnit::Lower ; }
  bool operator<=(const T& other) { return compare(other) != CompareUnit::Higher; }
  bool operator> (const T& other) { return compare(other) == CompareUnit::Higher; }
  bool operator>=(const T& other) { return compare(other) != CompareUnit::Lower ; }

  virtual uint32_t getHashCode() { return 0; }

protected:
  virtual CompareUnit compare(const T& other) const = 0;
};

struct Serializable {
  friend ostream& operator<<(ostream& output, const Serializable& obj) { return obj.serialize(output); }
  friend istream& operator>>(istream& input, Serializable& obj) { return obj.deserialize(input); }

protected:
  virtual ostream& serialize(ostream& output) const = 0;
  virtual istream& deserialize(istream& input) = 0;
};

template<typename T>
struct Entity : public Comparable<T>,
                public Serializable {};

struct Product : public Entity<Product> {
  Product(string name): name(name) {}

protected:
  virtual ostream& serialize(ostream& output) const { return output << name; }
  virtual istream& deserialize(istream& input) { return input >> name; }  
  Comparable::CompareUnit compare(const Product& other) const override
    { return Comparable::CompareUnit(name.compare(other.name)); }

private:
  string name;
};

int main()
{
  Product p("Banan");
  cout << p;
  return 0;
}

Zamien produkt na te swoje struktury, wypelnij 3 funkcje i masz gotowca.

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