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

Aktualizowanie danych w pliku [C++]

0 głosów
84 wizyt
pytanie zadane 14 marca w C i C++ przez Michal440 Nowicjusz (140 p.)
edycja 14 marca przez Michal440

Witam, nie mogę sobie poradzić z aktualizowaniem danych w pliku w C++. Dane w pliku wyglądają następująco (imię, nazwisko, klasa oraz wiek):
Jan Kowalski 1TS 17 
Karolina Nowak 4TI 20 

I powiedzmy, że chciałbym zmienić wiek Jana Kowalskiego z 17 na 18 - jak musiałbym to zrobić?

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

using namespace std;

int main()
{

    int uczniowie=25;
    fstream p1;
    ifstream p2;
    struct baza
    {
        string imie;
        string nazw;
        string klasa;
        string wiek;
    }u;



    string sz;
    int x;

    do
    {
        cout<<"MENU GLOWNE"<<endl;
        cout<<"----------------------------"<<endl;
        cout<<"1. Dopisz dane"<<endl;
        cout<<"2. Wyszukiwanie danych"<<endl;
        cout<<"3. Popraw dane"<<endl;
        cout<<"4. Usun rekord"<<endl;
        cout<<"5. Wyswietl wszystkie dane"<<endl;
        cout<<"6. KONIEC"<<endl;
        cout<<"----------------------------"<<endl;
        cout<<"Wybierz opcje: "; cin>>x;
        cout<<""<<endl;

        switch(x)           
            case 3:
                system("cls");
                p2.open("dane.txt", ios::in, ios::out);
                if(p1.good())
                {
                    cout<<"Wybrales opcje poprawiania danych:"<<endl<<endl;



                }else cout<<"Blad otwarcia pliku!";
                p1.close();
                cout<<""<<endl;
                cout<<"Wcisnij klawisz ENTER by powrocic do MENU"<<endl;
                system("pause");
                system("cls");

            break;
            default: cout<<"BLAD!"<<endl<<endl;
        }


    }while(x!=6);


    return 0;
}

Na razie to mam, ale tu nic wielkiego nie ma, nie wiem jak mam się za to zabrać. Bardzo bym prosił o pomoc.

1 odpowiedź

0 głosów
odpowiedź 15 marca przez Szfierzak Gaduła (3,200 p.)
Najprościej będzie jeżeli wczytasz dane z pliku do jakiejś struktury(listy, vektora), i wtedy możesz w dowolny sposób zmieniać dane w rekordach. Na koniec działania programu zapisz całą listę do pliku. Zastanów się też, czy nie potrzebujesz jakiegoś unikatowego identyfikatora dla osób - id, pesel, cokolwiek, ponieważ może zdarzyć się, że jest więcej osób o tym samym imieniu i nazwisku.
komentarz 16 marca przez Michal440 Nowicjusz (140 p.)
Mógłbyś napisać to w kodzie jakby miało to mniej więcej wyglądać?
komentarz 17 marca przez Szfierzak Gaduła (3,200 p.)

Zakładając istnienie struktury:

struct Base{
    int Id;
    string Name;
    string Surname;
    string Group;
    int Age;
};

można napisać funkcje do wczytywania/zapisu/edycji danych mniej więcej takie:

void readFile( string fileName, vector<Base*> *data )
{
    int id, age;
    string name, surname, group;
    Base *record;
    ifstream file(fileName.c_str());

    if( file.is_open() )
    {
        while( file >> id >> name >> surname >> group >> age )
        {
            record = new struct Base;
            record->Id = id;
            record->Name = name;
            record->Surname = surname;
            record->Group = group;
            record->Age = age;
            data->push_back(record);
        }
        file.close();
    }
    else
    {
        cout << "Unable to open file: " << fileName <<endl;
    }
}

void writeFile( string fileName, vector<Base*> *data )
{
    ofstream file(fileName.c_str());
    if( file.is_open() )
    {
        for(int i=0; i<data->size(); i++)
        {
            file << data->at(i)->Id << "    " << data->at(i)->Name << "     " << data->at(i)->Surname << "      " << data->at(i)->Group << "    " << data->at(i)->Age << endl;
        }
        file.close();
    }
    else
    {
        cout << "Unable to open file: " << fileName << endl;
    }
}

void showData( vector<Base*> *data )
{
    for(int i=0; i<data->size(); i++)
    {
        cout << data->at(i)->Id << "    " << data->at(i)->Name << "     " << data->at(i)->Surname << "      " << data->at(i)->Group << "    " << data->at(i)->Age << endl;
    }
}

void editData( vector<Base*> *data )
{
    int id, age;
    string name, surname, group;
    cout << "Select id for edit: ";
    cin >> id;
    for(int i=0; i<data->size(); i++)
    {
        if( data->at(i)->Id == id)
        {
            cout << "Edit data: ";
            cout << data->at(i)->Id << "    " << data->at(i)->Name << "     " << data->at(i)->Surname << "      " << data->at(i)->Group << "    " << data->at(i)->Age << endl << endl;
            cout << "Write new name: ";
            cin >> name;
            cout << "Write new surname: ";
            cin >> surname;
            cout << "Write new group: ";
            cin >> group;
            cout << "Write new age: ";
            cin >> age;
            data->at(i)->Name = name;
            data->at(i)->Surname = surname;
            data->at(i)->Group = group;
            data->at(i)->Age = age;
            cout << "Data updated!!" << endl;
            break;
        }
    }
}

Musisz jednak pamiętać, że trzeba odpowiednio zaalokować pamięć dla wektora, a później ją zwolnić.

Podobne pytania

0 głosów
1 odpowiedź 57 wizyt
pytanie zadane 14 czerwca w PHP, Symfony, Zend przez mknnn221 Początkujący (300 p.)
0 głosów
2 odpowiedzi 162 wizyt
+1 głos
2 odpowiedzi 230 wizyt
pytanie zadane 30 czerwca 2017 w SQL, bazy danych przez BeFree Początkujący (380 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

65,685 zapytań

112,323 odpowiedzi

237,052 komentarzy

46,659 pasjonatów

Przeglądających: 260
Pasjonatów: 22 Gości: 238

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...