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

[C++] Nie czyta poprawnie z pliku binarnego

Ostatnio zmodyfikowano 2013-03-08 23:27
Autor Wiadomość
m2247
Temat założony przez niniejszego użytkownika
[C++] Nie czyta poprawnie z pliku binarnego
» 2013-03-08 20:02:11
Witam, mam problem, robię prostą książkę telefoniczną na plikach binarnych. Mam program który wpisuje przez tablice do pliku binarnego, natomiast nie działa mi z pliku binarnego do tablicy. Robię tak: Czytam z pliku binarnego po jednym znaku, poszczególne dane osób są oddzielone spacjami, więc jeżeli czytam spacje wtedy to co przeczytałem idzie do zmiennej i tak 4 razy, ponieważ tyle danych ma jedna osoba. Wtedy usuwam to co w zmiennych. i od nowa zaczynam i wtedy pojawia się problem: zamiast znaku w zmiennej pomocniczej  jest np. coś takiego: J/x0 i wtedy program się sypie bo źle mi porównuje.  Proszę o pomoc :) Z góry dziękuje :)
Proszę się nie sugerować tym że jeżeli w programie dodamy do pliku, to potem wszystko jest ok, ponieważ nadal w tablicy są zmienne z dodawani.a

Oto cały kod ponieważ nie wiem gdzie jest błąd, może gdzieś w zapisie i go nie widzę.

C/C++
#include <vcl.h>
#include <iostream.h>
#include <fstream.h>
#pragma hdrstop

#pragma argsused

class osoba {
public:
    char * imie;
    char * nazwisko;
    char * adres;
    char * telefon;
   
public:
    void dopisz();
    void wyswietl();
    osoba( char * imi, char * nazwisk, char * adre, char * telefo );
   
};

class ksiazka {
private:
    osoba * t[ 10 ];
    int i;
    char source[ 100 ];
public:
    ksiazka();
    void otworz();
    void dodaj();
    void wyswietl_wszystko();
    void zapisz_do_ksiazki();
    void odczytaj_z_ksiazki();
    void odczytaj_z_ksiazki2();
};

ksiazka::ksiazka() {
    i = 0;
}

void ksiazka::otworz() {
    cout << "Podaj adres ksiazki do otwarcia: "; cin >> source;
}

void ksiazka::zapisz_do_ksiazki() {
    fstream f;
    f.open(( const char * ) & source, ios::binary | ios::out );
    for( int j = 0; j < i; j++ ) {
        f.write( t[ j ]->imie, strlen( t[ j ]->imie ) );
        f.write( t[ j ]->nazwisko, strlen( t[ j ]->nazwisko ) );
        f.write( t[ j ]->adres, strlen( t[ j ]->adres ) );
        f.write( t[ j ]->telefon, strlen( t[ j ]->telefon ) );
    }
    f.close();
}

void ksiazka::odczytaj_z_ksiazki() {
    fstream f; int g = 1; int z = 0;
    char tab; char pomoc[ 255 ] = ""; char tmp1[ 255 ] = "", tmp2[ 255 ] = "", tmp3[ 255 ] = "", tmp4[ 255 ] = "";
    f.open(( const char * ) & source, ios::binary | ios::in );
    while( f.read(( char * ) & tab, sizeof tab ) ) {
        cout << tab;
        strcat( pomoc,( char * ) & tab );
       
        if(( strcmp(( char * ) & tab, " " ) ) == 0 ) {
            if( g == 1 ) { strcpy( tmp1, pomoc ); strcpy( pomoc, "" ); }
            if( g == 2 ) { strcpy( tmp2, pomoc ); strcpy( pomoc, "" ); }
            if( g == 3 ) { strcpy( tmp3, pomoc ); strcpy( pomoc, "" ); }
            if( g == 4 ) {
                strcpy( tmp4, pomoc );
                t[ z ] = new osoba( tmp1, tmp2, tmp3, tmp4 );
                z++;
                g = 1;
                strcpy( pomoc, "" );
                strcpy( tmp1, "" );
                strcpy( tmp2, "" );
                strcpy( tmp3, "" );
                strcpy( tmp4, "" );
            }
            g++;
        }
    }
    f.close();
}

void ksiazka::odczytaj_z_ksiazki2() {
    fstream f; char tmp;
    f.open(( const char * ) & source, ios::binary | ios::in );
    while( f.read(( char * ) & tmp, sizeof tmp ) ) {
        cout << tmp;
    }
    f.close();
}

void ksiazka::dodaj() {
    char imie[ 100 ]; char nazwisko[ 100 ]; char adres[ 100 ]; char telefon[ 100 ];
    cout << "Podaj imie: "; cin >> imie; strcat( imie, " " );
    cout << "Podaj nazwisko: "; cin >> nazwisko; strcat( nazwisko, " " );
    cout << "Podaj adres: "; cin >> adres; strcat( adres, " " );
    cout << "Podaj telefon: "; cin >> telefon; strcat( telefon, " " );
    t[ i ] = new osoba( imie, nazwisko, adres, telefon );
    i++;
    strcpy( imie, "" );
    strcpy( nazwisko, "" );
    strcpy( adres, "" );
    strcpy( telefon, "" );
}

void ksiazka::wyswietl_wszystko() {
    for( int j = 0; j < i; j++ )
         t[ j ]->wyswietl();
   
}

osoba::osoba( char * imi, char * nazwisk, char * adre, char * telefo ) {
    int d;
    d = strlen( imi );
    imie = new char[ d + 1 ];
    strcpy( imie, imi );
    d = strlen( nazwisk );
    nazwisko = new char[ d + 1 ];
    strcpy( nazwisko, nazwisk );
    d = strlen( adre );
    adres = new char[ d + 1 ];
    strcpy( adres, adre );
    d = strlen( telefo );
    telefon = new char[ d + 1 ];
    strcpy( telefon, telefo );
}


void osoba::dopisz() {
    cout << "Podaj imie: "; cin >> imie; strcat( imie, " " );
    cout << "Podaj nazwisko: "; cin >> nazwisko; strcat( nazwisko, " " );
    cout << "Podaj adres: "; cin >> adres; strcat( adres, " " );
    cout << "Podaj telefon: "; cin >> telefon; strcat( telefon, " " );
}

void osoba::wyswietl() {
    cout << "imie: " << imie << endl;
    cout << "nazwisko: " << nazwisko << endl;
    cout << "adres: " << adres << endl;
    cout << "telefon: " << telefon << endl;
}

int main( int argc, char * argv[] )
{
    ksiazka k;
    k.otworz();
   
   
    k.wyswietl_wszystko();
    k.zapisz_do_ksiazki();
   
   
    k.odczytaj_z_ksiazki();
    k.wyswietl_wszystko();
   
    system( "pause" );
    return 0;
}

Jeszcze raz usuniesz swój temat po rozwiązaniu problemu i będziesz mógł się spodziewać konsekwencji.
xevuel
P-77941
Monika90
» 2013-03-08 21:46:35
ta linijka:
C/C++
strcat( pomoc,( char * ) & tab );
jest zupełnie bez sensu, drugim argumentem strcat musi być wskaźnik do zakończonego zerem łańcucha znaków, a nie do pojedyńczego znaku.

No i zrób coś z tymi nazwami zmiennych, i, g, t, tmp1, tmp2, pomoc, takie nazwy nic nikomu nie mówią.
P-77945
m2247
Temat założony przez niniejszego użytkownika
» 2013-03-08 23:27:34
ok :) dziękuje za pomoc, z tym sobie już poradziłem, zrobiłem tak: char *tab, a potem tylko tab[1]='\0'.
P-77949
« 1 »
  Strona 1 z 1