Program pomija zapis danych użytkownika na końcu pliku

0

Mam taki kod

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
std::fstream plik;
int ost;
std::string ciag;
int i=0;
void zobaczbaze()
{
    system( "cls" );
    plik.open("baza.txt");
    while( !plik.eof() )
    {
        plik>>ost>>ciag;
        std::cout<< ost<<" ";
        std::cout << ciag<<std::endl;
    }
    plik.close();
}
void dodajuzytkownika()
{
    plik.open("baza.txt", std::ios::app);
    {
        std::string nick1;
        std::cout<<"Podaj nazwe uzytkownika: ";
        std::cin>>nick1;
        plik<<nick1<< " "<<i<<"\n"<<std::endl;
        plik.close();
    };
}
int main()
{
    int wybor;
    plik.open("baza.txt");
    if (plik.good()!=false)
    {
        while( !plik.eof() )
        {
            plik>>ost>>ciag;
            i++;
        }
        std::cout<< "Prawidlowo otworzono baze danych.\nCo chcesz zrobic? [wpisz numer]\n[1]Pokaz baze\t[2]Dodaj uzytkownika do bazy\n";
        plik.close();
        std::cin>> wybor;
        switch (wybor)
        {
            case 1: zobaczbaze();
            break;
            case 2: dodajuzytkownika();
            break;
            default: std::cout<< "Nie mozesz tego wpisac!";
        }
    }
    else
    {
        std::cout << "Dostep zabroniony";
    }
    return 0;
}

Plik baza.txt:

1 ss
2 h

Program działa, ale nie wykonuje jednej rzeczy.
W funkcji dodajuzytkownika nie działa to:

plik<<nick1<< " "<<i<<std::endl;

Zamiast dopisać id i nazwę użytkownika na końcu pliku nic nie robi :/.

1
void dodajuzytkownika()
{
    plik.open("baza.txt", std::ios::app);
    {
        std::string nick1;
        std::cout<<"Podaj nazwe uzytkownika: ";
        std::cin>>nick1;
        plik<<nick1<< " "<<i<<"\n"<<std::endl;
        plik.close();
    };
}

Tutaj chyba chciałeś postawić jakiś warunek.

0
void dodajuzytkownika()
{
    plik.open("baza.txt", std::ios::app);
    if (plik.good()!=false)
    {
        std::string nick1;
        std::cout<<"Podaj nazwe uzytkownika: ";
        std::cin>>nick1;
        plik<<nick1<< " "<<i;
        plik.close();
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}

I nadal nic

0

Źle zapisujesz dane do pliku. Powinieneś to robić w ten sposób:

plik << i << " " << nick1 << std::endl;
0

Any ideas? :/
Aktualny kod:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
std::fstream plik;
int ost;
std::string ciag;
int i=0;
void zobaczbaze()
{
    system( "cls" );
    plik.open("baza.txt");
    while( !plik.eof() )
    {
        plik>>ost>>ciag;
        std::cout<< ost<<" ";
        std::cout << ciag<<std::endl;
    }
    plik.close();
}
void dodajuzytkownika()
{
    plik.open("baza.txt", std::ios::app);
    if (plik.good()!=false)
    {
        std::string nick1;
        std::cout<<"Podaj nazwe uzytkownika: ";
        std::cin>>nick1;
        plik << i+1 << " " << nick1 << std::endl;
        plik.close();
    }
    else
    {
        std::cout<< "Nie udalo sie otworzyc pliku!";
    }
}
int main()
{
    int wybor;
    plik.open("baza.txt");
    if (plik.good()!=false)
    {
        while( !plik.eof() )
        {
            plik>>ost>>ciag;
            i++;
        }
        std::cout<< "Prawidlowo otworzono baze danych.\nCo chcesz zrobic? [wpisz numer]\n[1]Pokaz baze\t[2]Dodaj uzytkownika do bazy\n";
        plik.close();
        std::cin>> wybor;
        switch (wybor)
        {
            case 1: zobaczbaze();
            break;
            case 2: dodajuzytkownika();
            break;
            default: std::cout<< "Nie mozesz tego wpisac!";
        }
    }
    else
    {
        std::cout << "Dostep zabroniony";
    }
    return 0;
}
1
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <functional>
using namespace std;

class User {
  public:
    User(int id=0, string name=""): id(id), name(name) {}

    friend ostream& operator<<(ostream& out, const User& user) {
      return out << user.id << " " << user.name;
    }

    friend istream& operator>>(istream& in, User& user) {
      return in >> user.id >> user.name;
    }

  private:
    int id;
    string name;
};

void show(istream& input) {
  User tmpUser;
  while(input >> tmpUser) {
    cout << tmpUser << "\n";
  }
}

void showHandler(string dbPath) {
  ifstream dbFile(dbPath);
  show(dbFile);
}

int getLastUserId(istream& input) {
  int i = 0;
  User tmpUser;
  while(input >> tmpUser) {
    ++i;
  }
  return i;
}

string getUserNameFromStdin() {
  string tmpName;
  cin >> tmpName;
  return tmpName;
}

void addUserHandler(string dbPath) {
  int lastId = 0;
  {
    ifstream dbFile(dbPath);
    lastId = getLastUserId(dbFile);
    dbFile.close();
  }

  ofstream dbFile(dbPath, ios_base::app);
  dbFile << User(lastId + 1, getUserNameFromStdin());
}

class Menu {
  public:
    typedef function<void(string)> Handler;


    Menu(map<int, Handler> actions): actions(actions) {}

    bool contains(int id) {
      return actions.count(id) > 0;
    }

    Handler get(int id) {
      return actions.at(id);
    }

  private:
    map<int, Handler> actions;
};

int main()
{
  Menu menu({
    { 1, showHandler },
    { 2, addUserHandler }
  });

  string menuPrompt = "Co chcesz zrobic?\n  [1] Pokaz baze\n  [2] Dodaj uzytkownika";
  cout << menuPrompt << "\n";

  int choice;
  cin >> choice;

  if(!menu.contains(choice)) {
    cout << "Akcja nie istnieje.";
    return -1;
  }

  Menu::Handler action = menu.get(choice);
  action("baza.txt");

  return 0;
}

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