Kolega @Patrycjerz podał Ci już informację o bezpośrednim błędzie w Twoim kodzie. Mam jeszcze szereg uwag co do dobrych praktyk. Jeśli będziesz chciał je uwzględnić, będzie Ci łatwiej później (a i innym którzy czytają Twój kod):
1. Staraj się nie używać using namespace std; . W małych przykładach to może być dopuszczalne, ale im wcześniej będziesz miał ten nawyk, tym lepiej.
2. Struktura z linii 6 to raczej Kontakt (jeden) a nie Kontakty (wiele). Wiele kontaktów jest w BazieKontaktow. Wszelkie indeksy mają typ std::size_t a nie int.
3. Możesz łączyć std::cout w dłuższe wyrażenie.
4. Nadużywasz std::endl; To wykonuje wyprowadzenie '\n' i opróżnienie strumienia które nie jest potrzebne tak często. U Ciebie wcale.
5. Stosuj std::ifstream lub std::ofstream. To jednoznacznie załatwia flagi otwarcia. Oczywiście możesz je podać ale domyślne (input/output) już masz poprzez rodzaj klasy strumienia.
6. Zbędne zamykanie pliku. Zamknięcie nastąpi po destrukcji obiektu strumienia.
Nie ingerowałem w strukturę Twojego kodu w sposób istotny. Myślę jednak że ta wersja jest czytelniejsza:
#include <iostream>
#include <fstream>
#include <string>
#include <cstddef>
constexpr static std::size_t ilosc_kontaktow = 5;
struct Kontakt
{
std::string imie;
std::string nazwisko;
unsigned wiek;
std::string telefon;
};
Kontakt BazaKontaktow[ilosc_kontaktow];
void WprowadzImie(std::size_t indeks)
{
std::cout << "Podaj imie:\n";
std::cin >> BazaKontaktow[indeks].imie;
}
void WprowadzNazwisko(std::size_t indeks)
{
std::cout << "Podaj nazwisko:\n";
std::cin >> BazaKontaktow[indeks].nazwisko;
}
void WprowadzWiek(std::size_t indeks)
{
std::cout << "Podaj wiek:\n";
std::cin >> BazaKontaktow[indeks].wiek;
}
void WprowadzTelefon(std::size_t indeks)
{
std::cout << "Podaj telefon:\n";
std::cin >> BazaKontaktow[indeks].telefon;
}
void WprowadzDaneKontaktu(std::size_t indeks)
{
WprowadzImie(indeks);
WprowadzNazwisko(indeks);
WprowadzWiek(indeks);
WprowadzTelefon(indeks);
}
void WyswietlDaneKontaktu(std::size_t indeks)
{
std::cout << std::string(42, '-') << '\n'
<< "Imie: " << BazaKontaktow[indeks].imie << '\n'
<< "Nazwisko: " << BazaKontaktow[indeks].nazwisko << '\n'
<< "Wiek: " << BazaKontaktow[indeks].wiek << '\n'
<< "Telefon: " << BazaKontaktow[indeks].telefon << '\n';
}
std::ostream& operator<<(std::ostream& out, const Kontakt& kontakt)
{
return out << "Imie: " << kontakt.imie << '\n'
<< "Nazwisko: " << kontakt.nazwisko << '\n'
<< "Wiek: " << kontakt.wiek << '\n'
<< "Telefon: " << kontakt.telefon << '\n';
}
void ZapisBazyKontaktow()
{
std::ofstream plik("BazaWizytowek.txt");
for(const auto& kontakt: BazaKontaktow) {
plik << kontakt << '\n';
}
}
int main()
{
for(std::size_t i = 0; i < ilosc_kontaktow; ++i)
{
WprowadzDaneKontaktu(i);
}
for(std::size_t i = 0; i < ilosc_kontaktow; ++i)
{
WyswietlDaneKontaktu(i);
}
ZapisBazyKontaktow();
}
Jeśli coś sugerować, zwróć uwagę że wprowadzasz dane typu std::string i unsigned int (w moim przykładzie). Różnice w funkcjach to tylko komunikat i pole które należy wypełnić.
Masz także widoczną nadmiarowość w funkcji WyswietlDaneKontaktu i operator<<. Także operowanie numerycznym indeksem w bazie danych nie jest wygodne.
Zadanie można więc wykonać nieco lepiej:
#include <iostream>
#include <fstream>
#include <string>
#include <cstddef>
constexpr static std::size_t ilosc_kontaktow = 1;
struct Kontakt
{
std::string imie;
std::string nazwisko;
unsigned wiek;
std::string telefon;
};
Kontakt BazaKontaktow[ilosc_kontaktow];
std::string WprowadzNapis(const std::string& komunikat)
{
std::string napis;
std::cout << komunikat;
std::cin >> napis;
return napis;
}
unsigned WprowadzLiczbe(const std::string& komunikat)
{
unsigned wartosc;
std::cout << komunikat;
std::cin >> wartosc;
return wartosc;
}
void WprowadzDaneKontaktu(Kontakt& kontakt)
{
kontakt.imie = WprowadzNapis("Imie: ");
kontakt.nazwisko = WprowadzNapis("Nazwisko: ");
kontakt.wiek = WprowadzLiczbe("Wiek: ");
kontakt.telefon = WprowadzNapis("Telefon: ");
}
std::ostream& operator<<(std::ostream& out, const Kontakt& kontakt)
{
return out << "Imie: " << kontakt.imie << '\n'
<< "Nazwisko: " << kontakt.nazwisko << '\n'
<< "Wiek: " << kontakt.wiek << '\n'
<< "Telefon: " << kontakt.telefon << '\n';
}
void ZapisBazyKontaktow(const std::string& NazwaPliku)
{
std::ofstream plik(NazwaPliku);
for(const auto& kontakt: BazaKontaktow)
{
plik << kontakt << '\n';
}
}
int main()
{
for(auto& kontakt: BazaKontaktow)
{
WprowadzDaneKontaktu(kontakt);
}
for(auto& kontakt: BazaKontaktow)
{
std::cout << std::string(42, '-')
<< '\n' << kontakt << '\n';
}
ZapisBazyKontaktow("BazaWizytowek.txt");
}