• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Brak zapisu do pliku txt

Object Storage Arubacloud
0 głosów
364 wizyt
pytanie zadane 23 kwietnia 2023 w C i C++ przez alfutek Początkujący (360 p.)

Hej, 

 

mam problem z zadaniem poniżej , a mianowicie z tym że nie zapisuje mi danych do pliku txt. i nie potrafię dojść dlaczego? 

stworzenie programu: „Książka adresowa”.

Dzień dobry,
Chciałbym zlecić Panu stworzenie programu o nazwie „Książka adresowa”, w której będę mógł zapisywać dane moich przyjaciół i znajomych.
Niech program zapisuje takie dane jak imię mojego przyjaciela, jego nazwisko, numer telefonu, email oraz adres 

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

using namespace std;

struct Person
{
    int id = 0;
    string firstName, lastName, phoneNumber, email, address;

};
//
vector<Person> readFromFile()
{
    vector<Person> people;
    ifstream file ("address_book.txt");

    if (file.is_open())
    {
        string line;
        while (getline (file, line)) // ksi¹¿ka strona 309
        {
            Person person;
            person.id = stoi(line.substr(0, line.find(','))); // podpowiedz ze stackoverflow
            line.erase(0, line.find(',') + 1);
            person.firstName = line.substr(0, line.find(','));
            line.erase(0, line.find(',') + 1);
            person.lastName = line.substr(0, line.find(','));
            line.erase(0, line.find(',') + 1);
            person.phoneNumber = line.substr(0, line.find(','));
            line.erase(0, line.find(',') + 1);
            person.email = line.substr(0, line.find(','));
            line.erase(0, line.find(',') + 1);
            person.address = line;
            people.push_back(person);
        }
        file.close();
    }

    return people;
}
void saveToFile(vector<Person>& people)
{
    ofstream file("address_book.txt");
    if (file.is_open())
    {
        for (int i = 0; i < people.size(); i++)
        {
            file << "ID: " << people[i].id << endl;
            file << "Imie: " << people[i].firstName << endl;
            file << "Nazwisko: " << people[i].lastName << endl;
            file << "Nr telefonu: " << people[i].phoneNumber << endl;
            file << "Mail: " << people[i].email << endl;
            file << "Adres: " << people[i].address << endl;
        }
        file.close();
        cout << "Dane zostaly zapisane do pliku." << endl;
    }
    else
    {
        cout << "Blad: nie udalo sie otworzyc pliku." << endl;
    }
}

void addPerson(vector<Person>& people, int &idCounter)
{
    Person person;
    person.id = idCounter++;

    cout << "Podaj imie: ";
    cin >> person.firstName;

    cout << "Podaj nazwisko: ";
    cin >> person.lastName;

    cout << "Podaj numer telefonu: ";
    cin >> person.phoneNumber;

    cout << "Podaj e-mail: ";
    cin.ignore(numeric_limits<streamsize>::max(),'\n');// forum pasja informatyki https://forum.pasja-informatyki.pl/183036/jak-zrobic-aby-nie-wczytywano-liter
    getline(cin, person.email);

    cout << "Podaj adres: ";
    getline(cin, person.address);
    cout << endl;
    people.push_back(person);
    cout << "Osoba dodana do ksiazki adresowej." << endl;

    cout << endl;
}

void displayPeople(const Person &person) // const - definiowanie sta³ych
{
    cout << "ID: " << person.id << endl;
    cout << "Imie: " << person.firstName << endl;
    cout << "Nazwisko: " << person.lastName << endl;
    cout << "Numer telefonu: " << person.phoneNumber << endl;
    cout << "Adres e-mail: " << person.email << endl;
    cout << "Adres: " << person.address << endl;
}

void displayAllPeople( vector<Person>& people)
{
    if (people.empty())
    {
        cout << "Ksiazka adresowa jest pusta." << endl;
        return;
    }

    cout << "Oto lista Twoich znajomych:" << endl;
    for (const auto& person : people)
    {
        displayPeople(person);
        cout << endl;
    }
}
void searchByFirstName(vector<Person>& people, const string& name)
{
    vector<Person> results;
     for (const auto& person : people)
    {
        if (person.firstName == name)
        {
            results.push_back(person);
        }
    }

    if (results.empty())
    {
        cout << "Nie znaleziono osob o podanym imieniu." << endl;
        return;
    }

    cout << "Oto wyniki wyszukiwania:" << endl;
    for (const auto& Person : results)
    {
        displayAllPeople(results);
        cout << endl;
    }
}


void searchByLastName(vector<Person>& people, const string& lastName)
{

    vector<Person> results;
    for (const auto& Person : people)
    {
        if (Person.lastName == lastName)
        {
            results.push_back(Person);
        }
    }

    if (results.empty())
    {
        cout << "Nie znaleziono osob o podanym nazwisku." << endl;
        return;
    }

    cout << "Oto wyniki wyszukiwania:" << endl;
    for (const auto& Person : results)
    {
        displayAllPeople(results);
        cout << endl;
    }
}

int main()
{
    vector<Person> people = readFromFile();
    int idCounter = people.empty() ? 1 : people.back().id+1; // forum pasja informatyki

    char choice;

    while (true)
    {
        cout << "Twoja Ksiazka Adresowa " << endl;
        cout << "1. Dodaj nowa osobe " << endl;
        cout << "2. Wyszukaj po imieniu" << endl;
        cout << "3. Wyszukaj po nazwisku" << endl;
        cout << "4 .Wyszystkie kontakty" << endl;
        cout << "5. Zakoncz program " << endl;

        cin >> choice;

        switch (choice)
        {
        case '1':
            addPerson(people, idCounter);
            break;

        case '2':
        {
            string firstName;
            cout << "Podaj imie: ";
            cin >> firstName;
            searchByFirstName(people, firstName);
            break;
        }

        case '3':
        {
            string lastName;
            cout << "Podaj nazwisko: ";
            cin >> lastName;
            searchByLastName(people, lastName);
            break;
        }
        case '4':
            displayAllPeople(people);
            break;

        case '5':
            cout << "Dziekujemy za skorzystanie z programu!" << endl;
            return 0;
        default:
            cout << "Nieprawidlowy wybor. Sprobuj ponownie." << endl;
            break;
        }
    }
    return 0;
}


Chciałbym móc wyszukiwać dane mojego przyjaciela, po tym jak wpiszę jego imię lub jego nazwisko. Czyli program ma mieć 2 różne opcje. Pierwsza: podaj imię – mają zostać wyświetlone wszystkie osoby mające tak na imię. Druga: podaj nazwisko – program ma wyświetlić osoby mające takie nazwisko.
Chciałbym również, aby program miał opcję wyświetlania wszystkich moich przyjaciół.
Proszę również o to, aby program zapisywał te dane do pliku tekstowego oraz odczytywał je zaraz po uruchomieniu programu , abym nie musiał ich wpisywać przy każdym uruchomieniu programu.

 

 

wydawało mi się, że program działa poprawnie bo funkcje menu działają poprawnie wg mnie jednak nie widzę pliku txt w folderze :/ 

 

3 odpowiedzi

+1 głos
odpowiedź 23 kwietnia 2023 przez VBService Ekspert (254,630 p.)
wybrane 23 kwietnia 2023 przez alfutek
 
Najlepsza

W funkcji addPerson brakuje wywołania zapisu danych

[ on-line ]

void addPerson(vector<Person>& people, int &idCounter)
{
    Person person;
    person.id = idCounter++;
 
    ...
    cout << "Osoba dodana do ksiazki adresowej." << endl;
 
    saveToFile(people);
 
    cout << endl;
}

 

komentarz 23 kwietnia 2023 przez alfutek Początkujący (360 p.)
faktycznie!

dziękuje, chyba za dlugo siedzę nad kodem, bo taka banalna sprawa mi umkneła.
komentarz 23 kwietnia 2023 przez alfutek Początkujący (360 p.)
pewnie kolejna banalna sprawa

 

dlaczego po zapisie danych do pliku nie mogę ich odczytać z pliku? wyskakuje mi błąd

 

terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoi
0 głosów
odpowiedź 23 kwietnia 2023 przez tangarr Mędrzec (154,860 p.)

Plik powstaje w katalogu roboczym użytym do uruchomienia programu.
Możesz go sprawdzić używając następujących funkcji:

- std::filesystem::current_path (jeżeli używasz C++17 lub nowszego)
- GetCurrentDirectory (jeżeli używasz Windowsa)
- getcwd (ze standardu POSIX)

0 głosów
odpowiedź 25 kwietnia 2023 przez alfutek Początkujący (360 p.)

mam jeszcze pytanie bo zmieniłam kod i wydawało mi się, że będzie już ok, ale nadal nie tworza mi się pliki tekstowe automatycznie:/ co mam nie tak z ios::in, ios::out? 

 

chyba się zagubiłam w tym wszystkim :/

 

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <limits>
#include <windows.h>
#include <sstream>

using namespace std;

struct Person
{
    int id = 0;
    string firstName, lastName, phoneNumber, email, address;

};

vector<Person> readDataFromFile(const string& filename)
{

    vector<Person> people;

    fstream file;
    file.open(filename, ios::in | ios::out);
    if (!file.is_open())
        {
        cerr << "Failed to open file: " << filename << endl;
        return people;
    }
    {
    string line{};
    while (getline(file, line))
        {
        Person person;
        stringstream ss(line);

        string idStr{};
        getline(ss, idStr, '|');
        person.id = atoi(idStr.c_str());

        getline(ss, person.firstName, '|');
        getline(ss, person.lastName, '|');

        getline(ss, person.phoneNumber, '|');

        getline(ss, person.email, '|');
        getline(ss, person.address, '|');

        people.push_back(person);
        }
    }
    file.close();
    return people;
}

void saveToFile(vector<Person>& people)
{
    fstream file;
    file.open("address_book.txt",ios::in | ios::out);
    if (file.is_open())
    {
        for (unsigned int i = 0; i < people.size(); i++)
        {
            file << "ID: " << people[i].id << endl;
            file << "Imie: " << people[i].firstName << endl;
            file << "Nazwisko: " << people[i].lastName << endl;
            file << "Nr telefonu: " << people[i].phoneNumber << endl;
            file << "Mail: " << people[i].email << endl;
            file << "Adres: " << people[i].address << endl;
        }
        file.close();
    }
}

int readIdCounterFromFile(const string& filename) {
    fstream file;
    file.open(filename, ios::in | ios::out);
    if (!file.is_open()) {
        cerr << "Failed to open file: " << filename << endl;
        return 0;
    }
    int idCounter = 0;
    file >> idCounter;
    file.close();
    return idCounter;
}
void saveIdCounterToFile(int idCounter)
{
    fstream file;
    file.open("id_counter.txt",ios::in | ios::out);
    if (file.is_open()) {
        file << idCounter;
        file.close();
    }
}

void addPerson(vector<Person>& people, int &idCounter)
{
    Person person;
    person.id = idCounter++;

    cout << "Podaj imie: ";
    cin >> person.firstName;

    cout << "Podaj nazwisko: ";
    cin >> person.lastName;

    cout << "Podaj numer telefonu: ";
    cin >> person.phoneNumber;

    cout << "Podaj e-mail: ";
    cin.ignore(numeric_limits<streamsize>::max(),'\n');// forum pasja informatyki https://forum.pasja-informatyki.pl/183036/jak-zrobic-aby-nie-wczytywano-liter
    getline(cin, person.email);

    cout << "Podaj adres: ";
    getline(cin, person.address);
    cout << endl;

    people.push_back(person);
    saveToFile(people);
    saveIdCounterToFile(idCounter); // dodane przypisanie wartości idCounter do pliku

    cout << "Osoba dodana do ksiazki adresowej." << endl;
    cout << endl;
}

void displayPeople(const Person& person) // const - definiowanie sta³ych
{
    cout << "ID: " << person.id << endl;
    cout << "Imie: " << person.firstName << endl;
    cout << "Nazwisko: " << person.lastName << endl;
    cout << "Numer telefonu: " << person.phoneNumber << endl;
    cout << "Adres e-mail: " << person.email << endl;
    cout << "Adres: " << person.address << endl;
}

void displayAllPeople(const vector<Person>& people)
{
    if (people.empty())
    {
        cout << "Ksiazka adresowa jest pusta." << endl;
        return;
    }

    cout << "Oto lista Twoich znajomych:" << endl;
    for (const auto& person : people)
    {
        displayPeople(person);
        cout << endl;
    }

}
void searchByFirstName(vector<Person>& people, const string& name)
{
    vector<Person> results;
     for (const auto& person : people)
    {
        if (person.firstName == name)
        {
            results.push_back(person);
        }
    }

    if (results.empty())
    {
        cout << "Nie znaleziono osob o podanym imieniu." << endl;
        return;
    }

    cout << "Oto wyniki wyszukiwania:" << endl;
    for (const auto& person : results)
    {
        displayPeople(person);
        cout << endl;
    }
}

void searchByLastName(vector<Person>& people, const string& lastName)
{

    vector<Person> results;
    for (const auto& person : people)
    {
        if (person.lastName == lastName)
        {
            results.push_back(person);
        }
    }

    if (results.empty())
    {
        cout << "Nie znaleziono osob o podanym nazwisku." << endl;
        return;
    }

    cout << "Oto wyniki wyszukiwania:" << endl;
    for (const auto& person : results)
    {
        displayPeople(person);
        cout << endl;
    }
}

int main()
{
    int idCounter = readIdCounterFromFile("id_counter.txt");
    vector<Person> people = readDataFromFile("address_book.txt");

    char choice;

    while (true)
    {
        cout << "Twoja Ksiazka Adresowa " << endl;
        cout << "1. Dodaj nowa osobe " << endl;
        cout << "2. Wyszukaj po imieniu" << endl;
        cout << "3. Wyszukaj po nazwisku" << endl;
        cout << "4 .Wyszystkie kontakty" << endl;
        cout << "5. Zakoncz program " << endl;

        cin >> choice;

        switch (choice)
        {
        case '1':
            addPerson(people, idCounter);
            break;

        case '2':
        {
            string firstName;
            cout << "Podaj imie: ";
            cin >> firstName;
            searchByFirstName(people, firstName);
            break;
        }

        case '3':
        {
            string lastName;
            cout << "Podaj nazwisko: ";
            cin >> lastName;
            searchByLastName(people, lastName);
            break;
        }
        case '4':
            displayAllPeople(people);
            break;

        case '5':
            cout << "Dziekujemy za skorzystanie z programu!" << endl;
            return 0;
        default:
            cout << "Nieprawidlowy wybor. Sprobuj ponownie." << endl;
            break;
        }
    }
    return 0;
}

 

komentarz 25 kwietnia 2023 przez Oscar Nałogowiec (29,320 p.)
Czy plik tworzy się? Znalazłaś go (to jest często problem jak ktoś korzysta z IDE)? Sprawdziłaś zawartość plików?

Dlaczego zawsze otwierasz plik do odczytu i zapisu? Najlepiej od razu używać właściwych "jednokierunkowych" klas ifstream i ofstream.

Odczytując plik zakładasz że 1 osoba jest zapisane w jednej linii a poszczególne pola rozdzielone są znakiem '|'. Przy zapisie zapisujesz każde pole do nowej linii  poprzedzone "słowem kluczowym". To nie zadziała.
komentarz 27 kwietnia 2023 przez alfutek Początkujący (360 p.)
edycja 28 kwietnia 2023 przez alfutek

Plik się tworzy bez problemu w folderze i zapisuje dane również bez problemu do pliku.

popracowałam na kodzie (zmieniłam sporo) jednak dalej mam jakieś zaćmienie i nie mam pojęcia co może byś dalej nie tak z odczytem pliku

mam jakiś problem z  funkcją void readDataFromFile(vector<Person>& people)  tylko nie mam już pojęcia jaki :/

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <limits>
#include <windows.h>
#include <cstdlib>

using namespace std;

const string DATA_FILE = "address_book.txt";

struct Person
{
    int id;
    string firstName, lastName, phoneNumber, email, address;

};

string readLine()
{
    string input;
    cin.sync();
    getline(cin, input);
    return input;
}
void readDataFromFile(vector<Person>& people) 
{
    ifstream file(DATA_FILE, ios::app);
    file.close();

    file.open(DATA_FILE, ios::in);

    if (!file.is_open())
    {
        cerr << "Failed to open file: " << DATA_FILE << endl;
        file.open(DATA_FILE, ios::out);
        file.close();
    }

    string line;
    int lineNumber = 1;
    Person person;

    while (getline(file, line))
    {
        switch (lineNumber)
        {
        case 1:
            person.id = atoi(line.c_str());
            break;
        case 2:
            person.firstName = line;
            break;
        case 3:
            person.lastName = line;
            break;
        case 4:
            person.phoneNumber = atoi(line.c_str());
            break;
        case 5:
            person.email = line;
            break;
        case 6:
            person.address = line;
            people.push_back(person);
            break;
        }
        if (lineNumber == 6)
            lineNumber = 1;
        else
            lineNumber++;

    }
    file.close();
}

void saveToFile(const Person& person)
{
    ofstream file(DATA_FILE, ios::app);

    if (file.is_open())
    {
        file << person.id << ", "<< person.firstName << ", " << person.lastName << ", "
             << person.phoneNumber << ", "<< person.email << ", "<< person.address << endl;
    }
    file.close();
}

a odczytem w maine, nie mam już pomysłu jak to naprawić 

int main()
{
    vector<Person> people;
    readDataFromFile(people);

    char choice;

    while (true)
    {
        system("cls");
        cout << "Twoja Ksiazka Adresowa " << endl;
        cout << "1. Dodaj nowa osobe " << endl;
        cout << "2. Wyszukaj po imieniu" << endl;
        cout << "3. Wyszukaj po nazwisku" << endl;
        cout << "4 .Wyszystkie kontakty" << endl;
        cout << "5. Zakoncz program " << endl;

        cin >> choice;

        switch (choice)
        {
        case '1':
            addPerson(people);
            break;

        case '2':
            searchByFirstName(people);
            break;

        case '3':
            searchByLastName(people);
            break;

        case '4':
            displayAllPeople(people);
            break;

        case '5':
            cout << "Dziekujemy za skorzystanie z programu!" << endl;
            return 0;
        default:
            cout << "Nieprawidlowy wybor. Sprobuj ponownie." << endl;
            break;
        }
    }
    return 0;
}

 

 

a cały kod wygląda tak 

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <limits>
#include <windows.h>
#include <cstdlib>

using namespace std;

const string DATA_FILE = "address_book.txt";

struct Person
{
    int id;
    string firstName, lastName, phoneNumber, email, address;

};

string readLine()
{
    string input;
    cin.sync();
    getline(cin, input);
    return input;
}
void readDataFromFile(vector<Person>& people) 
{
    ifstream file(DATA_FILE, ios::app);
    file.close();

    file.open(DATA_FILE, ios::in);

    if (!file.is_open())
    {
        cerr << "Failed to open file: " << DATA_FILE << endl;
        file.open(DATA_FILE, ios::out);
        file.close();
    }

    string line;
    int lineNumber = 1;
    Person person;

    while (getline(file, line))
    {
        switch (lineNumber)
        {
        case 1:
            person.id = atoi(line.c_str());
            break;
        case 2:
            person.firstName = line;
            break;
        case 3:
            person.lastName = line;
            break;
        case 4:
            person.phoneNumber = atoi(line.c_str());
            break;
        case 5:
            person.email = line;
            break;
        case 6:
            person.address = line;
            people.push_back(person);
            break;
        }
        if (lineNumber == 6)
            lineNumber = 1;
        else
            lineNumber++;

    }
    file.close();
}

void saveToFile(const Person& person)
{
    ofstream file(DATA_FILE, ios::app);

    if (file.is_open())
    {
        file << person.id << ", "<< person.firstName << ", " << person.lastName << ", "
             << person.phoneNumber << ", "<< person.email << ", "<< person.address << endl;
    }
    file.close();
}

void addPerson(vector<Person>& people)
{
    Person person;

    cout << "Podaj imie: ";
    person.firstName = readLine();

    cout << "Podaj nazwisko: ";
    person.lastName = readLine();

    cout << "Podaj numer telefonu: ";
    person.phoneNumber = readLine();

    cout << "Podaj e-mail: ";
    person.email = readLine();

    cout << "Podaj adres: ";
    person.address= readLine();

    person.id = (people.size()) + 1 ;
    cout << endl;

    people.push_back(person);

    saveToFile(person);

    cout << "Osoba dodana do ksiazki adresowej." << endl;
    cout << endl;
    system("pause");
}

void displayPerson(const Person& person) // const - definiowanie stalych
{
    cout << "ID: " << person.id << endl;
    cout << "Imie: " << person.firstName << endl;
    cout << "Nazwisko: " << person.lastName << endl;
    cout << "Numer telefonu: " << person.phoneNumber << endl;
    cout << "Adres e-mail: " << person.email << endl;
    cout << "Adres: " << person.address << endl;
}

void displayAllPeople(const vector<Person>& people)
{
    if (people.empty())
    {
        cout << "Ksiazka adresowa jest pusta." << endl;
        cout << endl;
        system("pause");
        return;
    }

    cout << "Oto lista Twoich znajomych:" << endl;
    for (const auto& person : people)
    {
        displayPerson(person);
        cout << endl;
        system("pause");
    }
}

void searchByFirstName(vector<Person>& people)
{
    bool nameFound = false;
    string firstName;
    cout << "Podaj imie: ";
    firstName = readLine();

    if (people.empty())
    {
        cout << "Ksiazka adresowa pusta." << endl;
        cout << endl;
        system("pause");
        return;
    }

    for (const Person& person : people)
    {
        if (person.firstName == firstName)
        {
            displayPerson(person);
            cout << endl;
            nameFound = true;
            system("pause");
        }
    }

    if (!nameFound)
    {
        cout << "Nie znaleziono osob o podanym imieniu." << endl;
        cout << endl;
        system("pause");
    }

}

void searchByLastName(vector<Person>& people)
{
    bool nameFound = false;
    string lastName;
    cout << "Podaj nazwisko: ";
    lastName = readLine();

    if (people.empty())
    {
        cout << "Ksiazka adresowa pusta." << endl;
        cout << endl;
        system("pause");
        return;
    }
    for (const Person& person : people)
    {
        if (person.lastName == lastName)
        {
            displayPerson(person);
            cout << endl;
            nameFound = true;
            system("pause");
        }
    }

    if (!nameFound)
    {
        cout << "Nie znaleziono osob o podanym nazwisku." << endl;
        cout << endl;
        system("pause");
    }

}

int main()
{
   
    vector<Person> people;
    readDataFromFile(people);

    char choice;

    while (true)
    {
        system("cls");
        cout << "Twoja Ksiazka Adresowa " << endl;
        cout << "1. Dodaj nowa osobe " << endl;
        cout << "2. Wyszukaj po imieniu" << endl;
        cout << "3. Wyszukaj po nazwisku" << endl;
        cout << "4 .Wyszystkie kontakty" << endl;
        cout << "5. Zakoncz program " << endl;

        cin >> choice;

        switch (choice)
        {
        case '1':
            addPerson(people);
            break;

        case '2':
            searchByFirstName(people);
            break;

        case '3':
            searchByLastName(people);
            break;

        case '4':
            displayAllPeople(people);
            break;

        case '5':
            cout << "Dziekujemy za skorzystanie z programu!" << endl;
            return 0;
        default:
            cout << "Nieprawidlowy wybor. Sprobuj ponownie." << endl;
            break;
        }
    }
    return 0;
}


 

komentarz 28 kwietnia 2023 przez Oscar Nałogowiec (29,320 p.)
Teraz jest odwrotnie - read zakłada, że jedno pole jest w jednej linijce, a save zapisuje cały Person w jednej linijce, z polami oddzielonymi przecinkami. Zamień te przecinki na endl.

Podobne pytania

0 głosów
1 odpowiedź 359 wizyt
0 głosów
2 odpowiedzi 547 wizyt
pytanie zadane 31 stycznia 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
0 odpowiedzi 530 wizyt
pytanie zadane 6 listopada 2018 w C i C++ przez Szarp Początkujący (270 p.)

92,696 zapytań

141,607 odpowiedzi

320,113 komentarzy

62,055 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...