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ę. #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 |
|
Monika90 |
» 2013-03-08 21:46:35 ta linijka: 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ą. |