Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

pochetnichki problem sa binarnom datotekom

[es] :: C/C++ programiranje :: pochetnichki problem sa binarnom datotekom

[ Pregleda: 3735 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.drenik.net.

Sajt: marko-radic.blogspot.com


+137 Profil

icon pochetnichki problem sa binarnom datotekom15.03.2005. u 20:47 - pre 232 meseci
imam gadan i nervirajutji problem!
pokushavam da napravim mali podsetnik program za shkolu, i da podatke chuvam u binarnoj datoteci, ali neshto netje
pa netje

evo koda mog programa:

Code:

#include <stdio.h>
#include <stdlib.h>

class Obaveze {
    char *datum;
    char *predmet;
    char *note;
public:
    Obaveze () {};
    Obaveze (char *, char *, char *);
    static void dodaj ();
    static void listaj ();
};

Obaveze::Obaveze (char *dat, char *pred, char *not) {    
    datum = dat;
    predmet = pred;
    note = not;
};

void Obaveze::dodaj () {
    char *ulaz1 = new char [];
    char *ulaz2 = new char [];
    char *ulaz3 = new char [];
    FILE *obavezef;
    unsigned int veldat;

    if ((obavezef = fopen("obaveze.3maj", "r+b")) == NULL) {
        obavezef = fopen("obaveze.3maj", "w+b");
        veldat = 0;
        fwrite (&veldat, sizeof veldat, 1, obavezef);
    }
    else
        fread (&veldat, sizeof veldat, 1, obavezef);


    
    putchar('\n');
    printf("Datum obaveze: ");
    gets(ulaz1);
    printf("Predmet: ");
    gets(ulaz2);
    printf("Unesi obavezu: ");
    gets(ulaz3);
    putchar('\n');
            
    veldat++;
    Obaveze nova(ulaz1, ulaz2, ulaz3);
    
    fseek(obavezef, 0L, SEEK_END);
    fwrite(&nova, sizeof Obaveze, 1, obavezef);
    rewind(obavezef);    
    fwrite(&veldat, sizeof veldat, 1, obavezef);
    fclose(obavezef);
        
};

void Obaveze::listaj () {
    unsigned int i;
    Obaveze novi;
    FILE *obavezef;
    unsigned int veldat;
    
    if (!(obavezef = fopen("obaveze.3maj", "r+b"))) 
        exit(1);
    fread (&veldat, sizeof veldat, 1, obavezef);
    putchar('\n');


    for (i=1; i<=veldat; i++) {
        printf("%3d.", i);
        fread (&novi, sizeof Obaveze, 1, obavezef);
        printf(" %s\t%s\t%s\n", novi.datum, novi.predmet, novi.note);
    }
    fclose(obavezef);
};


void main(void) {
    char *ulaz = new char [];    

    while (1) {
        printf("\nKomande programa:\n");
        printf("d - Dodaj novu obavezu\n");
        printf("l - Prelistaj sve obaveze\n");
        printf("i - Izlaz iz programa\n");
        printf("Izbor: ");
        gets(ulaz);
        switch (ulaz[0]) {
        case 'd':
            Obaveze::dodaj();            
            break;
        case 'l':
            Obaveze::listaj();            
            break;
        case 'i':
            exit(0);            
        }
    };
}


i o chemu se radi:
kada prvi put pokrenem program, unesem x obaveza itd, i kada nakon toga pokrenem funkciju listaj(), sve radi kako treba,
medjutim, kada izadjem iz programa, i pokrenem ga ponovo, i pokusham da izlistam, on mi prikazhe one unose koje sam
napravio, ali prazne!
satima se muchim, ali nije mi jasno o chemu se radi...
izvinjavam se shto sam postovao ovoliki kod, ali ne znam gde je problem, pa moram da bacim ovde sve da biste vi mogli
da vidite...


when there is a why there is no how
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.beotel.net.



Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 00:37 - pre 232 meseci
Nikada nemoj da snimas pointer u file. Jednostavno nema smisla.

Sta mislis koliki je sizeof(Obaveze)? Mislis da zavisi od duzine stringova koji su sadrzani u primerku.. E gresis...
U tvom primeru, sizeof(Obaveze) = 12 bytes (pod uslovom da je pointer predstavljen 32bitno, tj. 4 bajta) zato sto klasa sadrzi 3 pointera * 4 byte = 12 bytes.

fwrite(&nova, sizeof Obaveze, 1, obavezef); ce snimiti 12 bajta u file, i to samo pointere, a sadrzaj memorije (tj stringovi) nece biti snimljeni.

Molim te da pojasnis sta znaci char *ulaz1 = new char [];?

yooyo
 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.drenik.net.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 05:40 - pre 232 meseci
aha!
u tom zecu grmi chuch!
iskreno, razmishljao sam o tome, ali nije mi delovalo logichno da tje da pravi frku oko pokazivacha... ali kada neko drugi to kazhe, deluje savrsheno logichno... silly me!

e, hvala puno, chim dodjem danas iz shkole ima da prepravim ovo chudo od "programa"

a ovo shta znachi shto si pitao, pa to je dinamichki znakovni niz neodredjene duzhine... jel i tu greshka?
u principu vetj duzhe vreme na taj nachin pravim char nizove, i nikada nisam imao problema (osim kada koristim operator delete - jer onda moram da navedem duzhinu niza, mada programi su josh uvek suvishe mali da bih morao da brinem o stalnom oslobadjanju memorije)
when there is a why there is no how
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.beotel.net.



Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 07:09 - pre 232 meseci
Citat:
pa to je dinamichki znakovni niz neodredjene duzhine... jel i tu greshka?


Prvi put vidim tako nesto. Cudi me da se kompajler ne buni... Koliko ja znam to ne moze tako. Kako bi onda funkcija gets znala da treba da realocira niz ako si uneo vise slova?

yooyo
 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.drenik.net.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 13:30 - pre 232 meseci
pa pazi, pretpostavljam da "[]" govori da je promenljiva niz, a sada koliki niz to nije bitno (jer je u pitanju dinamichki naravno).

e kada bi recimo
Code:
stavio delete [] promenljiva
e tada bi nastali problemi, i program bi se zakucavao. to sam otklanjao tako shto bih u deklaraciji promenljive umesto
Code:
char *prom = new char []
pisao :
Code:
char *prom = new char [maxduzina]


tada bi sve lepo radilo. ali pazi, ne pishem neke ogromne programe da sada u svakom momentu moram da brinem o kolichini upotrebljene memorije, tako da operator delete i ne koristim. a poshto ne zhelim da se petljam oko toga koliko bi "trebalo" da bude dugachak moj niz, samo ostavim prazne zagrade i komp se sam baktje oko toga... radi bez frke i kompajler ne prijavljuje greshku

i da, zamalo da zaboravim, izvrshio sam izmene u kodu kao shto si mi rek'o i radi savrsheno... hvala puno!
when there is a why there is no how
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 15:06 - pre 232 meseci
Citat:
pa pazi, pretpostavljam da "[]" govori da je promenljiva niz, a sada koliki niz to nije bitno (jer je u pitanju dinamichki naravno).
Ovakvi nizovi ne postoje u C++. Ako alociraš nizove znakova, uvek mora da se navede dužina.

C++ standard (pogl. 5.3.4, str 80) kaže ovako (odlomak):

Sintaksa za new je:

Code:
new-expression
     ::_opt new new-placement_opt new-type-id new-initializer_opt
     ::_opt new new-placement_opt { type-id }new-initializer_opt
 
 new-type-id:
     type-specifier-seq new-declarator_opt
 
 new-declarator:
     ptr-operator new-declarator_opt
     direct-new-declarator
 
 direct-new-declarator:
     [ expression ]
     direct-new-declarator [ constant-expression ]
 

(ovo nije celokupna deklaracija, tek bitan je samo deo:

Code:
direct-new-declarator:
     [ expression ]
 

Proverio sam i izgleda da expression ne može da bude prazan niz, tj. new char [] je sintaksno neispravan new-expression. Zašto ga tvoj kompajler prihvata -- pojma nemam.

f

 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.drenik.net.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 15:24 - pre 232 meseci
@filmil
veruj mi josh manje znam zashto ga kompajler prihvata, ali zaista nisam imao problema do sada sa time. uvek je prevodio kako treba, kao shto sam napisao jedini problem se javljao prilikom unishtavanja promenljive (niza).
inache koristim Visual Studio 6. mozhda bi neki drugi alat prijavio greshku. ne bih znao kaSti

when there is a why there is no how
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl.

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 15:40 - pre 232 meseci
Evo šta sam dobio pokušavajući da prevedem tvoj program.

Okreni-obrni, dinamički znakovni nizovi ne postoje u C++-u i tvoj program koji to koristi je sigurno neispravan. To što nisi imao problema je slučajnost.

f

Code:

cd /home/filip/
g++ -Wall test.cc
test.cc:15: error: expected `,' or `...' before '!' token
test.cc: In constructor `Obaveze::Obaveze(char*, char*, char*)':
test.cc:18: error: expected primary-expression before ';' token
test.cc: In static member function `static void Obaveze::dodaj()':
test.cc:22: error: expected primary-expression before ']' token
test.cc:23: error: expected primary-expression before ']' token
test.cc:24: error: expected primary-expression before ']' token
test.cc:38: error: `quot' undeclared (first use this function)
test.cc:38: error: (Each undeclared identifier is reported only once for each function it appears in.)
test.cc:38: error: stray '\' in program
test.cc:38: error: `n' undeclared (first use this function)
test.cc:38: error: expected primary-expression before ')' token
test.cc:38: error: expected `;' before ')' token
test.cc:45: error: stray '\' in program
test.cc:45: error: expected primary-expression before ')' token
test.cc:45: error: expected `;' before ')' token
test.cc:51: error: expected primary-expression before ',' token
test.cc: In static member function `static void Obaveze::listaj()':
test.cc:67: error: `quot' undeclared (first use this function)
test.cc:67: error: stray '\' in program
test.cc:67: error: `n' undeclared (first use this function)
test.cc:67: error: expected primary-expression before ')' token
test.cc:67: error: expected `;' before ')' token
test.cc:72: error: expected primary-expression before ',' token
test.cc: At global scope:
test.cc:79: error: `main' must return `int'
test.cc:79: error: return type for `main' changed to `int'
test.cc: In function `int main(...)':
test.cc:80: error: expected primary-expression before ']' token
test.cc:90: error: `quot' undeclared (first use this function)
test.cc:90: error: `&' cannot appear in a constant-expression
test.cc:90: error: expected `:' before ';' token
test.cc:90: error: `d' undeclared (first use this function)
test.cc:90: error: expected primary-expression before ':' token
test.cc:90: error: expected `;' before ':' token
test.cc:93: error: `&' cannot appear in a constant-expression
test.cc:93: error: expected `:' before ';' token
test.cc:93: error: `l' undeclared (first use this function)
test.cc:93: error: expected primary-expression before ':' token
test.cc:93: error: expected `;' before ':' token
test.cc:96: error: `&' cannot appear in a constant-expression
test.cc:96: error: expected `:' before ';' token
test.cc:96: error: `i' undeclared (first use this function)
test.cc:96: error: expected primary-expression before ':' token
test.cc:96: error: expected `;' before ':' token

Compilation exited abnormally with code 1 at Wed Mar 16 16:02:00
 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.drenik.net.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: pochetnichki problem sa binarnom datotekom16.03.2005. u 17:33 - pre 232 meseci
nemam pojma zaista, mislim, mogu da poshaljem sam program da proverish da radi 100% ispravno. testirao sam ga, i zaista nisam naletao na bagove.
ali ovo nije jedini put da sam koristio ovakvu sintaksu..

nemam pojma, ali hvala u svakom sluchaju - netju praviti vishe takve "stvari" :)
when there is a why there is no how
 
Odgovor na temu

[es] :: C/C++ programiranje :: pochetnichki problem sa binarnom datotekom

[ Pregleda: 3735 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.