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

Problem z adresowaniem pliku FILE

Ostatnio zmodyfikowano 2013-07-27 17:32
Autor Wiadomość
eBbi
Temat założony przez niniejszego użytkownika
Problem z adresowaniem pliku FILE
» 2013-07-26 10:50:29
Witam. Mam mały problem i nie wiem jak go rozwiązać, bo według mnie ten problem nie ma prawa bytu.

Sprawa Wygląda tak:

mam sobie plik w którym mam dwie klasy.

C/C++
class obsluga_bazy
{
public:
    obsluga_bazy();
   
    bool BDv1_przypisywanie_plikow( FILE * plik, const char * nazwa, const char * flaga );
    bool BDv1_generator_nazw( char zmienna[], const char * nazwa_pliku, size_t numer_pliku, size_t rzad_wielkosc_liczby, const char * rozszerzenie );
    bool BDv1_sprawdzanie_szablonu( FILE * plik, const char * naglowek, const char * wersja, const char * nazwa_listy, const char znak_oddzielajacy );
   
    size_t dlugosc_lancucha( const char zmienna[] );
    size_t ilosc_cyfr_liczby( int liczba );
   
    void czyszczenie_tablicy_znakow( char * ciag_znakow, size_t dlugosc_ciagu );
   
    char zmiana_liczby_na_znak( int liczba, size_t rzad_cyfry );
    char * laczenie_lancuchow_znakow( const char * lancuch_pierwszy, const char * lancuch_drugi, size_t dlugosc_pierwszego_lancucha, size_t dlugosc_drugiego_lancucha );
   
private:
   
    char buffor[ DLUGOSC_BUFFORA ];
   
};

class pliki
{
   
public:
    pliki();
   
   
   
    char nazwa_pliku[ MAKSYMALNA_DLUGOSC_NAZWY ];
    bool istnieje;
    bool szablon;
   
   
    size_t miejsce_rozpoczecia_rekordow;
    size_t ilosc_poprawnych_rekordow;
    size_t ilosc_uszkodzonych_rekordow;
   
    FILE * plik;
   
};

obydwie klasy zostały zainicjowane globalnie:
C/C++
obsluga_bazy baza;
pliki plik_bazy[ ILOSC_PLIKOW_BAZY ];

chodzi mi o przypadek w którym w jednej funkcji File plik zostaje otwarty strumień, a w innej funkcji ma pracować na tym strumieniu. Problem polega na tym że w tej drugiej funkcji on już nie widz otwartego strumienia:

C/C++
plik_bazy[ i ].istnieje = baza.BDv1_przypisywanie_plikow( plik_bazy[ i ].plik, plik_bazy[ i ].nazwa_pliku, ODCZYT_ZAPIS );

if( plik_bazy[ i ].istnieje )
     plik_bazy[ i ].szablon = baza.BDv1_sprawdzanie_szablonu( plik_bazy[ i ].plik, NAGLOWEK_BAZY, WERSJA_AKTUALNA_BAZY, plik_bazy[ i ].nazwa_pliku, '*' );



C/C++
bool obsluga_bazy::BDv1_przypisywanie_plikow( FILE * plik, const char * nazwa, const char * flaga )
{
   
    plik = fopen( nazwa, flaga );
    if( plik == NULL )
         return false;
    else
         return true;
   
}

C/C++
bool obsluga_bazy::BDv1_sprawdzanie_szablonu( FILE * plik, const char * naglowek, const char * wersja, const char * nazwa_listy, const char znak_oddzielajacy )
{
   
    char * argument_i_nazwa = NULL;
    char * argument_i_wersja = NULL;
   
    printf( "\n\n proba \n\n" );
    if( plik == NULL )
         return false;
   
    printf( "\n\n Weszlo \n\n" );
   
    ....
Dlaczego on nie widzi już tego adresowania?  wywala funkcje przy tyn if'ie
P-88820
Admixior
» 2013-07-26 14:45:09
W jednej funkcji zmieniasz wartość wskaźnika(a raczej wartość kopii wskaźnika) a w drugiej funkcji wysyłasz ten nie zmieniony, bo ta kopia zmieniona wskaźnika została usunięta przy wyjściu z funkcje poprzedniej.

Zauważ że otrzymujesz do obu funkcji kopie wskaźnika który jest zdefiniowany gdzieś wcześniej z wartością null. W jednej funkcji zmieniasz adres na który wskazuje kopia wskaźnika. Nie zmieniasz to co jest pod tym adresem na który wskazuje kopia wskaźnika, ale samą kopię wskaźnika, czyli tak jakbyś zmieniał zwykłą kopie int-a. Więc masz 2 wybory. Albo do funkcji wysyłać wskaźnik na wskaźnik do FILE który chcesz zmienić albo referencję na wskaźnik do FILE.
P-88832
eBbi
Temat założony przez niniejszego użytkownika
» 2013-07-27 17:32:23
Dziękuje ;*. Działa

tak wygląda funkcja po zmianie:
C/C++
bool obsluga_bazy::BDv1_sprawdzanie_szablonu( FILE ** plik, const char * naglowek, const char * wersja, const char * nazwa_listy, const char znak_oddzielajacy )
{
   
    char * argument_i_nazwa = NULL;
    char * argument_i_wersja = NULL;
   
   
    if( * plik == NULL )
         return false;
   
Zamykam
P-88912
« 1 »
  Strona 1 z 1