Dopisywanie do listy kolejnej osoby.

0

Witam!

Mam do zrobienia taki program obslugujacy "baze danych" :D

Baze danych dałem w cudzysłowie, gdyż nie ma ona nic wspólnego z prawdziwą bazą danych :D

Chodzi o to, ze mam dopisac do powstalego juz pliku binarnego kolejne osoby. Ale chcialbym , zeby program pisal ktora osobe dopisujemy. I teraz niewiem jak to uczynić. Chciałbym to zrobic najprostszym sposobem, zeby sie nie pogubic.

Słyszalem cos o funkcji tellp i tellg ale niestety tylko bylo cos wspomniane na laborkach.

Czy ma ma ktos jakis pomysl?

Wklejam tutaj to co udalo mi sie na razie zrobic:


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

struct dane
{
	string imie,nazwisko;
	float stan_konta;
};

void utworz_plik()
{
	int i = 1;
	dane a;
	char znak;
	
	ofstream dane ("dane.bin",ios::binary);
	do
	{
		cout << "Osoba " << i << ":" << endl << endl;
		cout << "Podaj imie:" << endl;
		cin >> a.imie;
		cout << "Podaj nazwisko:" << endl;
		cin >> a.nazwisko;
		cout << "Podaj stan konta:" << endl;
		cin >> a.stan_konta;
		cout << endl << endl;
		
		dane.write((char*)&a, sizeof(dane));
		
		cout << "Czy chcesz wprowadzic kolejna osobe? , T/t" << endl << endl;
		cin >> znak;
		i++;
	}
	while (znak == 'T' || znak == 't');
	dane.close();
	
	
		
}

void dopisz_osobe()
{
	dane b;
	int ilosc;
	char znak;
	fstream dane ("dane.bin", ios::binary|ios::ate);
	ilosc = dane.tellp();
	
	do
	{
		cout << "Osoba " << ??? << endl << endl;
		cout << "Podaj imie:" << endl;
		cin >> b.imie;
		cout << "Podaj nazwisko:" << endl;
		cin >> b.nazwisko;
		cout << "Podaj stan konta:" << endl;
		cin >> b.stan_konta;
		cout << endl << endl;
		
		dane.write((char*)&b,sizeof(dane));
		
		cout << "Czy chcesz podac kolejna osobe? , T/t" << endl << endl;
		cin >> znak;
	}
	
	while(znak == 't' || znak == 'T');
	dane.close();
	
	
}

int main()
{
	
	int wybor,ilosc;
	
	cout << "Witaj w programie!" << endl << endl << endl;
	cout << "Wybierz:" << endl;
	cout << "[1] - aby utworzy nowa baze danych" << endl;
	cout << "[2] - aby dopisac osoby do bazy danych" << endl;
	cout << "[3] - aby wyswietlic dane osob z bazy od podanego numeru" << endl;
	cout << "[4] - aby zapisac do pliku tekstowego dane tych osob" << endl;
	cout << " ,ktorych stan konta jest wiekszy lub rowny od zadanego progu" << endl;
	
	cin >> wybor;
	cout << endl << endl;
	
	switch(wybor)
	{
		
		case 1:
			utworz_plik();
			break;
			
		case 2:
			dopisz_osobe();
			break;
			
			
		case 3:
			
		case 4:
			
		default:
			cout << "Niewlasciwy wybor!" << endl << endl;
		
		
	}
	return 0;
}

0

znaczy sie tak jak jest to teraz to dziala ok i tak zawsze robie :)

0

To, ze dziala to albo przypadek albo glupota.

#include <stdio.h>
#include <stdlib.h>
 
typedef struct person {
    char name[20];
    char surname[20];
    float cash;
} person;
 
void createPerson(person* p)
{
    scanf("%19s %19s %f", p->name, p->surname, &p->cash);
}
 
void savePerson(person p, FILE* f)
{
    fseek(f, 0, SEEK_END);              // przesuniecie na koniec pliku
    fwrite((char*)&p, sizeof(p), 1, f); // zapisanie osoby do pliku
}
 
void loadPerson(person* p, FILE* f, int id)
{
    fseek(f, id*sizeof(person), SEEK_SET);
                            // ustawienie wskaznika na wybrana osobe
    fread((char*)p, sizeof(*p), 1, f);  // wczytanie osoby z pliku
}

void displayPerson(person p)
{
    printf("%s\n%s\n%.4f\n", p.name, p.surname, p.cash);
}

int main()
{
    person x, y;
    FILE* fp;               // utworzenie wskaznika do struktury pliku
    fp = fopen("pliczek.bin", "wb");
                            // otworzenie pliku do pisania binarnego
    createPerson(&x);
    savePerson(x, fp);      // zapisanie osoby do pliku
    fclose(fp);             // zamkniecie pliku
    fp = fopen("pliczek.bin", "rb");
                            // otworzenie pliku do czytania
    loadPerson(&y, fp, 0);  // wczytanie osoby z pliku
    displayPerson(y);       // wyswietlenie na stdout
    fclose(fp);             // zamkniecie pliku
    return 0;
}
0

A moze teraz jeszcze spojrzelibyscie czemu funkcja max nie zwraca mi w rzeczywistosci wartosci maxymalnej a po wyswietleniu konczy sie errorem?


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

struct dane
{
	char imie[30];
	char nazwisko[30];
	float stan_konta;
};

void utworz_plik()
{
	int i = 1;
	dane a;
	char znak;
	
	ofstream dane ("dane.bin",ios::binary);
	do
	{
		cout << "Osoba " << i << ":" << endl << endl;
		cout << "Podaj imie:" << endl;
		cin >> a.imie;
		cout << "Podaj nazwisko:" << endl;
		cin >> a.nazwisko;
		cout << "Podaj stan konta:" << endl;
		cin >> a.stan_konta;
		cout << endl << endl;
		
		dane.write((char*)&a, sizeof(dane));
		
		cout << "Czy chcesz wprowadzic kolejna osobe? , T/t" << endl << endl;
		cin >> znak;
		i++;
	}
	while (znak == 'T' || znak == 't');
	dane.close();
	
	
}

void dopisz_osobe()
{
	dane a;
	int i = 1;
	char znak;
	fstream dane ("dane.bin",ios::binary|ios::app);
	
	do
	{
		cout << "Podaj imie:" << endl;
		cin >> a.imie;
		cout << "Podaj nazwisko:" << endl;
		cin >> a.nazwisko;
		cout << "Podaj stan konta:" << endl;
		cin >> a.stan_konta;
		cout << endl << endl;
		
		dane.write((char*)&a,sizeof(dane));
		
		cout << "Czy chcesz podac kolejna osobe? , T/t" << endl << endl;
		cin >> znak;
		i++;
	}
	while(znak == 't' || znak == 'T');
	dane.close();
	
	
}

void wyswietl()
{
	int numer;
	dane a;
	
	cout << endl << endl;
	cout << "Od ktorej osoby chcesz wyswietlic baze? (podaj numer):" << endl;
	cin >> numer;
	
	fstream dane ("dane.bin",ios::binary|ios::in);
	dane.seekg((numer-1)*sizeof(dane),ios::beg);
	
	while(!dane.eof())
	{
		dane.read((char*)&a,sizeof(dane));
			
			if(dane.good())
			{
				cout << "Imie:" << endl;
				cout << a.imie << endl;
				cout << "Nazwisko:" << endl;
				cout << a.nazwisko << endl;
				cout << "Stan konta:" << endl;
				cout << a.stan_konta << endl;
			}
			
	}
	
	dane.clear();
	dane.close();
}

void max()
{
	dane max,a;
	int i = 1;
	fstream dane("dane.bin",ios::in|ios::binary);
	
	while(!dane.eof())
	{
		dane.read((char*)&a,sizeof(dane));
		
			if(dane.good())
			{	
				if(i==1)
					max = a;
				else
					if(a.stan_konta>max.stan_konta)
						max = a;
				i++;
			}
	}
	dane.clear();
	dane.close();
	
	cout << "Osoba, ktora zarabia najwiecej to:" << endl << endl;
	cout << max.imie << "  " << max.nazwisko << endl << endl;
	cout << "Stan konta tej osoby to:" << endl;
	cout << max.stan_konta << endl << endl;
	
}
			

int main()
{
	
	int wybor,ilosc;
	
	cout << "Witaj w programie!" << endl << endl << endl;
	cout << "Wybierz:" << endl;
	cout << "[1] - aby utworzy nowa baze danych" << endl;
	cout << "[2] - aby dopisac osoby do bazy danych" << endl;
	cout << "[3] - aby wyswietlic osobe, ktora ma najwiekszy stan konta" << endl;
	cout << "[4] - aby wyswietlic dane osob z bazy od podanego numeru" << endl;
	cout << "[5] - aby zapisac do pliku tekstowego dane tych osob" << endl;
	cout << " ,ktorych stan konta jest wiekszy lub rowny od zadanego progu" << endl;
	
	cin >> wybor;
	cout << endl << endl;
	
	switch(wybor)
	{
		
		case 1:
			utworz_plik();
			break;
			
		case 2:
			dopisz_osobe();
			break;
			
		case 3:
			max();
			break;
			
		case 4:
			
		default:
			cout << "Niewlasciwy wybor!" << endl << endl;
		
		
	}
	return 0;
}

Zmienilem juz zamiast stringa dalem char.

0

czemu funkcja max nie zwraca mi w rzeczywistosci wartosci maxymalnej

Bo "zwraca" void?

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