Aplikacja pseudo bazodanowa z wykorzystaniem plików tekstowych

0

Cześć,

Chciałbym skorzystać trochę z Waszej wiedzy i pomocy. Przyznam się szczerze, że jest to pierwszy taki większy program, który chcę wykonać. Całą aplikację chcę napisać języku C++ i musi ona zawierać m.in. obsługę plików, edycję plików, dodawanie/usuwanie rekordów, wyszukiwanie rekordów i jakieś sortowanie wyświetlanych danych. Myślałem sobie, że dane z pliku można wczytać do listy (biblioteka STL). Tylko zasadnicze pytanie? W jakiej kolejności powinienem zbudować taki program?

  1. Stworzenie klas, które odpowiednio będą przechowywać dane (jedna klasa zawierająca informacje o pacjentach, druga o lekarzach, trzecia o jakaś historia chorób pacjenta).
  2. Menu z funkcją case.
  3. Wczytywanie danych z pliku do listy i wyświetlanie ich na ekran.
  4. Zapisywanie do pliku.

Struktura pliku tekstowego wygląda następująco:

Imie
Nazwisko
Wiek
Imie
Nazwisko
Wiek

Plik patient.cpp:

#include <iostream>
#include "patient.h"
 
using namespace std;
 
void Patient::saveToFile()
{
    cout << endl << "Podaj imie: ";
    cin >> name;
    cout << endl << "Podaj nazwisko: ";
    cin >> surname;
    cout << endl << "Podaj wiek: ";
    cin >> age;
}
 
void Patient::loadFromFile()
{
    cout << endl << name << " " << surname << " || Wiek: " << age << " lat." << endl;
}
 
Patient::Patient(string n, string s, int a)
{
    name = n;
    surname = s;
    age = a;
}
 
Patient::~Patient()
{
    cout << endl << "Destruktor ";
}

Plik patient.h:

#include <iostream>
 
using namespace std;
 
class Patient
{
    string name;
    string surname;
    int age;
 
public:
 
    Patient(string="Imie", string="Nazwisko", int=0);
    ~Patient;
 
    void loadFromFile();
    void saveToFile();
}; 

**
Obecnie main wygląda tak:**

string name, surname;
int age;
 
int main()
{
     fstream file;
     file.open("patient.txt", ios::in);
 
     if(file.good() == false)
     {
         cout << "Ten plik nie istnieje - blad.";
         exit(0);
     }
 
     string line; //przechowuje pobrana linie tekstu:
     int number_line=1;
     while(getline(file, line))
     {
         switch(number_line)
         {
             case 1: name = line; break;
             case 2: surname = line; break;
             case 3: age = atoi(line.c_str()); break;
         }
         number_line++;
     }
    file.close();
 
    cout << name << " " << surname << " " << age << " lat" << endl;
 
} 

Ktoś ma jakieś rady, które ułatwią mi napisanie pierwszego programu?

2

Takie szybkie i proste do poprawienia uwagi:

  1. nie używaj using namespace std poza jakimiś prostymi przykładami. http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-in-c-considered-bad-practice
  2. używaj \n zamiast std::endl.
  3. Używaj postinkrementacji gdy faktycznie jest to potrzebne. W innych przypadkach staraj się używać preinkrementacji.
1

Ponad to co napisał @Phestek:

  1. Nie używaj zmiennych globalnych
  2. Dlaczego Twoje funkcje load/save to file wypisują coś na ekran (i na dodatek nie działają na plikach)? Łamie to SRP
  3. Patient(string="Imie", string="Nazwisko", int=0); niska czytelność, powinieneś podać tu nazwy parametrów. Dodatkowo przyjmowanie przez kopię często jest złym pomysłem.
1

Dodatkowo:
1. W funkcji int main() chciałeś wypisać całą bazę danych?
2. Switch nie działa tak jak trzeba jeżeli baza danych jest większa niż 3 linijki.

Switch działający tak jak ten w twoim kodzie:

for(int i = 1; i <= 10; ++i){
	switch(i){
		case 1:
			cout << "1\n";
			break;
		case 2:
			cout << "2\n";
			break;
		case 3:
			cout << "3\n";
			break;
	}
}

---------- WYNIK ----------
1
2
3

A raczej chciałeś zaimplementować coś w tym stylu

for(int i = 0; i<10; ++i){
	switch(i % 3){
		case 0:
			cout << "1\n";
			break;
		case 1:
			cout << "2\n";
			break;
		case 2:
			cout << "3\n";
			break;
	}
}

---------- WYNIK ----------
1
2
3
1
2
3
1
2
3
1

3. Zabezpiecz switch przed nieporządaną wartością tzn.:

switch(arg){
	case 1: break;
	.
	.
	.
	default:
		cout << "Bledne zapytanie\n";
}
0

Cześć, witajcie ponownie. Poprawiłem trochę błędów, obecnie wyświetlają mi się dane z pliki i zapisują do wektora. Mam również klasę i jak rozumiem w tym momencie moje dane z pliku zapisywane są tylko i wyłącznie w wektorze i nie korzystają w ogóle z klasy, mam rację? Co do zapisywania danych do pliku, to będę musiał popracować w jakiś sposób nad automatycznym tworzeniem unikalnego klucza pacjentów, czyli ID. Może powinienem zrobić menu w inny sposób? Najpierw czytuję zawartość plików do wektora za pomocą jednego z wyborów w głównym menu, a dopiero potem mogę działać z tymi danymi, czyli:
1 - wyświetlanie
2 - zapisywanie danych do pliku
3 - wyszukiwanie danych w pliku
4 - sortowanie danych
5 - usuwanie

Aktualnie tak prezentuje się mój kod. Proszę o wszelkie rady i nakierowania, czy mój tok myślenia jest dobry.

Plik patient.h:

#pragma once
#include <string>

class Patient
{
public:
    Patient(int id, std::string name = "Imie", std::string surname = "Nazwisko", unsigned char age = 0, unsigned int phone_numer = 0);
    ~Patient();

    //void saveToFile();

private:
    int id;
    std::string name;
    std::string surname;
    unsigned char age;
    unsigned int phone_number;
};
 

Plik patient.cpp:

#include <iostream>
#include <string>
#include <stdlib.h>
#include "patient.h"

using std::string;
using std::cin;
using std::cout;

Patient::Patient(int id, string name, string surname, unsigned char age, unsigned int phone_number):
    id{id}, name{name}, surname{surname}, age{age}, phone_number{phone_number}
{
}

Patient::~Patient()
{
    cout << "\nDestruktor ";
}
 

Plik main:

 #include <string>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iostream>

int main()
{
        int zmienna;
        std::cout << "1. Wyswietl dane o pacjentach. \n";
        std::cout << "2. Wprowadz nowego pacjenta. \n \n";
        std::cout << "Twoj wybor: ";
        std::cin >> zmienna;
        system("CLS");

        switch(zmienna)
        {
            case 1:
            {
                std::vector<int> ids;
                std::vector<std::string> names;
                std::vector<std::string> surnames;
                std::vector<unsigned int> ages;
                std::vector<unsigned int> phone_numbers;

                int id;
                std::fstream file;
                std::string name, surname;
                unsigned char age;
                unsigned int phone_number;

                file.open("patient.txt", std::ios::in);
                if(file.good() == false)
                {
                    std::cout << "Ten plik nie istnieje - blad.";
                    return 0;
                }

                std::string line; //przechowuje pobrana linie tekstu:
                int number_line = 0;
                while(getline(file, line))
                {
                    switch(number_line % 5)
                    {
                        case 0:
                            id = atoi(line.c_str());
                            break;
                        case 1:
                            name = line;
                            break;
                        case 2:
                            surname = line;
                            break;
                        case 3:
                            age = atoi(line.c_str());
                            break;
                        case 4:
                            phone_number = atoi(line.c_str());

                            ids.push_back(id);
                            names.push_back(name);
                            surnames.push_back(surname);
                            ages.push_back(age);
                            phone_numbers.push_back(phone_number);
                            break;
                        }
                        number_line++;
                    }

                for(size_t i = 0; i < names.size(); ++i)
                {
                    std::cout << "ID: [" << ids[i] << "] " << names[i] << " " << surnames[i] << " " << ages[i] << " lat || " << "Numer telefonu: " << phone_numbers[i] << "\n";
                }
            }
                break;

            case 2:
            {
                std::string name, surname;
                unsigned int ages = 0;
                unsigned int phone_number;

                std::cout << "Podaj imie: ";
                std::cin >> name;
                std::cout << "Podaj nazwisko: ";
                std::cin >> surname;

                    do
                    {
                        std::cout << "Podaj wiek: ";
                        std::cin >> ages;

                        if (ages > 125)
                        {
                            system("CLS");
                            std::cout << "Za duzy wiek. Podaj poprawna wartosc! \n \n";
                        }
                    } while (ages > 125);

                std::cout << "Podaj numer telefonu: ";
                std::cin >> phone_number;

                std::fstream file;
                file.open("patient.txt", std::ios::app | std::ios::out);
                    if(file.good() == false)
                    {
                        std::cout << "Ten plik nie istnieje - blad.";
                        return 0;
                    }

                file << name << "\n";
                file << surname << "\n";
                file << ages << "\n";
                file << phone_number << "\n";

                file.close();
            }
                break;
        }
}
pszk130 napisał(a):

Dodatkowo:
1. W funkcji int main() chciałeś wypisać całą bazę danych?
2. Switch nie działa tak jak trzeba jeżeli baza danych jest większa niż 3 linijki.

Masz rację, zapomniałem o tym!

0

Poczyść te switche. Niech odwołują się do jakiejś funkcji/metody, a nie bezpośrednio w nich piszesz kod. Przez to całość staje się zupełnie nieczytelna.

2

Dajesz return 0 z funkcji void, możesz dac return; ale najlepiej napisac kod tak, by nie trzeba było tego robić, wystarczy inaczej napisać warunek.

0

Proszę, tak obecnie wygląda kod pliku main.cpp:

#include <string>
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iostream>

void WczytywanieDanych()
{
    std::vector<int> ids;
    std::vector<std::string> names;
    std::vector<std::string> surnames;
    std::vector<unsigned int> ages;
    std::vector<unsigned int> phone_numbers;

    int id;
    std::fstream file;
    std::string name, surname;
    unsigned char age;
    unsigned int phone_number;

    file.open("patient.txt", std::ios::in);
    if(file.good() == false)
    {
        std::cout << "Ten plik nie istnieje - blad.";
        //return NULL;
    }

    std::string line; //przechowuje pobrana linie tekstu:
    int number_line = 0;
    while(getline(file, line))
    {
        switch(number_line % 5)
        {
            case 0:
                id = atoi(line.c_str());
                break;
            case 1:
                name = line;
                break;
            case 2:
                surname = line;
                break;
            case 3:
                age = atoi(line.c_str());
                break;
            case 4:
                phone_number = atoi(line.c_str());

                ids.push_back(id);
                names.push_back(name);
                surnames.push_back(surname);
                ages.push_back(age);
                phone_numbers.push_back(phone_number);
                break;
            }
                number_line++;
        }

    for(size_t i = 0; i < names.size(); ++i)
    {
        std::cout << "ID: [" << ids[i] << "] " << names[i] << " " << surnames[i] << " " << ages[i] << " lat || " << "Numer telefonu: " << phone_numbers[i] << "\n";
    }

}

void SaveToFile()
{
    int id;
    std::string name, surname;
    unsigned int ages = 0;
    unsigned int phone_number;

    std::cout << "Podaj identyfikator: ";
    std::cin >> id;
    std::cout << "Podaj imie: ";
    std::cin >> name;
    std::cout << "Podaj nazwisko: ";
    std::cin >> surname;

    do
    {
        std::cout << "Podaj wiek: ";
        std::cin >> ages;

        if (ages > 125)
        {
            system("CLS");
            std::cout << "Za duzy wiek. Podaj poprawna wartosc! \n \n";
        }
    } while (ages > 125);

    std::cout << "Podaj numer telefonu: ";
    std::cin >> phone_number;

    std::fstream file;
    file.open("patient.txt", std::ios::app | std::ios::out);
    if(file.good() == false)
    {
        std::cout << "Ten plik nie istnieje - blad.";
        //return 0;
    }

    file << id << "\n";
    file << name << "\n";
    file << surname << "\n";
    file << ages << "\n";
    file << phone_number << "\n";

    file.close();
}

void Menu()
{
    int zmienna;
    std::cout << "1. Wyswietl dane o pacjentach. \n";
    std::cout << "2. Wprowadz nowego pacjenta. \n \n";
    std::cout << "Twoj wybor: ";
    std::cin >> zmienna;
    system("CLS");

    switch(zmienna)
    {
        case 1:
            {
                WczytywanieDanych();
                std::cout << "\nAby wrocic do menu kliknij przycisk: [1]. ";
                int choise;
                std::cin >> choise;

                if (choise = 1)
                {
                    system("CLS");
                    Menu();
                }
            }
            break;

        case 2:
            {
                SaveToFile();
                std::cout << "\nAby wrocic do menu kliknij przycisk: [1]. ";
                int choise;
                std::cin >> choise;

                if (choise = 1)
                {
                    system("CLS");
                    Menu();
                }
            }
            break;
        default:
            std::cout << "Zly wybor - wybierz ponownie.";
    }
}

int main()
{
    Menu();
}

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