Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wypisywanie danych ze struct do pliku- problem z zapisem.

Ostatnio zmodyfikowano 2015-08-08 16:52
Autor Wiadomość
SquashPL
Temat założony przez niniejszego użytkownika
Wypisywanie danych ze struct do pliku- problem z zapisem.
» 2015-08-04 18:49:16
Witajcie

Na ten moment mam taki kod. Nie wiem jednak jak powiązać struct z funkcją zapisz. Siedzę już nad tym trochę i nie wiem jak to ogarnąć. Pomożecie?
C/C++
#include <iostream>
#include <cstdlib>
#include <fstream>


using namespace std;

struct dane
{
    char miejscowosc[ 25 ];
    char nrdomu[ 25 ];
    char imie[ 25 ];
    char nazwisko[ 25 ];
};


void zapisz()

{
    std::fstream plik;
    plik.open( "plik.txt", std::ios::in | std::ios::out );
    if( plik.good() == true )
    {
        std::string baza;
        for( int i = 0; i <= 2; i++ )
        {
            getline( std::dane[ i ] )
            plik.write( & baza[ 0 ], baza.length() );
        }
        plik.close();
    }
   
   
   
   
    int main()
    {
        dane tab[ 2 ];
        for( int i = 1; i <= 2; i++ )
        {
           
            cout << "Podaj dane" << i << "ucznia" << endl;
            cout << "Podaj miejscowosc" << endl;
            cin >> tab[ i ].miejscowosc;
            cout << "Podaj nr domu" << endl;
            cin >> tab[ i ].nrdomu;
            cout << "Podaj imie" << endl;
            cin >> tab[ i ].imie;
            cout << "Podaj nazwisko";
            cin >> tab[ i ].nazwisko;
        }
        zapisz();
    }
}
P-135705
bombatom69
» 2015-08-04 20:12:21
Nie chcę Cię martwić ale źle to wygląda.
Nie rozumiesz wielu spraw.

1. Skąd funkcja [zapisz] ma "wiedzieć" czym są dane?
2. [zapisz] działa na rzecz obiektów klasy dane i może być metodą
3. Ciało main również wskazuje na to, że operacje tam wykonywane (pobranie danych od użytkownika) mogłoby być zawarte w metodzie

W istocie nie łączysz w ogóle struktury z resztą kodu. Nie korzystasz z jej dobrodziejstw.

Idea ogólna jest taka:

struct dane{
//tutaj twoje pola
void zapisz();
void pobierz();
};

void dane::zapisz(){
// tutaj zapis, ale musi być przemyślany
}

void dane::pobierz(){
// tutaj pobieranie które robisz w main - potrzebne pewne zmiany
}

P-135719
pekfos
» 2015-08-04 20:57:56
Co main() robi w funkcji zapisz()?

Zapis binarny

W istocie nie łączysz w ogóle struktury z resztą kodu. Nie korzystasz z jej dobrodziejstw.
A musi..?
P-135720
bombatom69
» 2015-08-08 01:39:06
Sorry pekfos ale czytam już nie pierwszy Twój post i prawie każdy doprowadza mnie do wniosku, że coś z Tobą jest nie tak. Daruję sobie tę wątpliwą przyjemność obcowania z Tobą. Życzę dobrego samopoczucia.
P-135864
Maciek
» 2015-08-08 13:18:37
Ok, nie lubicie się :). Ale wracając do tematu, faktycznie struktura może zawierać "luźny zbiór danych", ale autor napisał, że "nie może powiązać z funkcją zapisz [...]" w takim wypadku od razu nasuwa mi się jednak konieczność włączenia funkcji czytających / zapisujących do struktury z danymi. Kod zaczynał by wtedy przypominać bardzie C++ niż "spagetti", gdzie wszystko znajduje się wsz ędzie i może każdy ma dostęp do wszystkiego, dodatkowo twoje dane zabezpieczył bym jako prywatne.
P-135880
pekfos
» 2015-08-08 13:33:15
Ale wracając do tematu, faktycznie struktura może zawierać "luźny zbiór danych", ale autor napisał, że "nie może powiązać z funkcją zapisz [...]" w takim wypadku od razu nasuwa mi się jednak konieczność włączenia funkcji czytających / zapisujących do struktury z danymi.
Może to również powiązać przekazując wskaźnik/referencję na strukturę jako argument do funkcji - to powinien znać i rozumieć. To też rozwiązanie. Nie musi prowadzić do kodu spaghetti, a struktura pozostaje "luźnym zbiorem danych", jeśli tylko się tego chce. Zamiast tylko sugerować i podawać obiektowe podejście, odeślijcie do odpowiedniego kursu. Niewiele da same rozwiązanie za kogoś problemu, używając nieznanych dla niego technik.
P-135882
carlosmay
» 2015-08-08 14:03:27
Tablica  struktur
dane tab[ 2 ];
 nie jest przekazana do
zapisz()
.
Funkcja jej nie zna więc nie możesz na niej operować.
P-135883
bombatom69
» 2015-08-08 16:52:49
carlos: to właśnie była kluczowa część wiadomości ode mnie.
Ten kod nie ma prawa się skompilować.

Wracając do dyskusji o obiektowości, czy jest konieczna czy nie. Obiektowość to wykroczenie poza C do domeny C++, więc faktycznie nie zawsze trzeba jej chcieć. Tutaj jednak pytający korzysta już z bibliotek, które pod zwykłym C są niedostępne. Wniosek jest taki, że o ile nie ma on jakichś szczególnych planów to warto jest pójść w stronę C++.
P-135886
« 1 »
  Strona 1 z 1