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

Datoteke - gdje nastaje problem?

[es] :: C/C++ programiranje :: Datoteke - gdje nastaje problem?

[ Pregleda: 2519 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

--ja--

Član broj: 4387
Poruke: 232
*.mobile.carnet.hr.

ICQ: 132872590


+3 Profil

icon Datoteke - gdje nastaje problem?25.04.2006. u 20:40 - pre 219 meseci
Imam kod koji tekstualnu datoteku treba prepisati u direktnu. Na prvi pogled sve radi ok, no dešava se da su zapisi do 136 ispravni, dok je 137 "pomaknut" za 1 byte... Kasnije je ova pojava, čini mi se, sve učestalija...

Code:
#include<stdio.h>

typedef struct{
       int broj;
       char ime[25];
       char prezime[50];
       double rodjenje;
       char JMBG[13+1];
} igrac;

int main1() {
    igrac nogometas;
    FILE *dat;
    int rbroj;
    dat = fopen("700.dat", "r");
    if (dat == NULL) return 0;
    
    scanf("%d", &rbroj);
    fseek(dat, --rbroj * sizeof(nogometas), SEEK_SET);
    if (fread(&nogometas,  sizeof(nogometas), 1, dat)) {
       if (!nogometas.broj) { 
          printf("Zapis je prazan\n");
       } else {
          printf("Traženi zapis je: %d\nPronadjen je zapis:\n\n", ++rbroj);
          printf("%4d. %15s %15s %.lf %13s \n", nogometas.broj, nogometas.ime, nogometas.prezime, nogometas.rodjenje, nogometas.JMBG);
       }
    
    }
    system("PAUSE");
    return 0;
}


int main() {
    double broj;
    igrac nogometas;
    FILE *baza, *novi, *nf;
    int a=1;
    
    nf = fopen("nf.txt", "w");
    baza = fopen("baza.csv", "r");
    novi = fopen("700.dat", "w");
    fseek(novi, 0L, SEEK_SET);
    if (baza == NULL) return 0;
    
    while (1) {
      if (a == 0) break;
      a = 0;
      
      if (fscanf(baza, "%s %s %lf %lf", nogometas.ime, nogometas.prezime, &nogometas.rodjenje, &broj) != EOF) {
         if (broj) nogometas.broj = (int)(broj - 7000000); else nogometas.broj = 0;
         a++;
         if (broj) {
            strcpy(nogometas.JMBG, "1234567890123");
         } else {
            strcpy(nogometas.JMBG, "0000000000000");
         }
         fwrite(&nogometas, sizeof(nogometas), 1, novi);
         fprintf(nf,"%4d. %15s %15s %5.lf %13s\n", nogometas.broj, nogometas.ime, nogometas.prezime, nogometas.rodjenje, nogometas.JMBG);
      } 
    }
    close(novi);
    close(baza);
    close(nf);
    system("PAUSE");
    return 0;
}


Ulazna datoteka je u privitku. Donja funkcija generira datoteku 700.dat, te datoteku nf.txt (ovo mi je služilo za provjeru da vidim je li nastala pogreška kod čitanja).
Gornja funkcija čita datoteku 700.dat. Po pokretanju, zahtjeva unos broja, te čita unešeni zapis... Zapis je prazan ako je broj = 0.
Ja sam stvarno izgubio živce tražeći grešku, pa molim vas iskusnije da pogurate malo.

Hvala!

[Ovu poruku je menjao --ja-- dana 25.04.2006. u 22:15 GMT+1]
http://www.dropbox.com/referrals/NTQ0MTI2NDc5
https://www.agronomija.info/
Failure is not an option. It comes bundled with your Microsoft product.
Prikačeni fajlovi
 
Odgovor na temu

n1tr0
Freelance
Cortanovci / NS

Član broj: 55279
Poruke: 465
80.93.231.*

Sajt: grubicv.iz.rs


+2 Profil

icon Re: Datoteke - gdje nastaje problem?26.04.2006. u 01:15 - pre 219 meseci
Citat:
fseek(dat, --rbroj * sizeof(nogometas), SEEK_SET);

Nisam imao vremena bas da pogledam, ali ako imas strukturu igrac i pogledas njenu velicinu, a onda je upisujes u fajl sa jos dodatnim '\n' to ti je jos jedan bajt - znaci trebalo bi --rbroj * sizeof(nogometas)+1, valjda... :-)
Bolje bi ti bilo da upotrebis binarni zapis, posto ce ti biti jednostavnije, a i datoteka ce zauzeti mnogo manje prostora...
 
Odgovor na temu

--ja--

Član broj: 4387
Poruke: 232
161.53.76.*

ICQ: 132872590


+3 Profil

icon Re: Datoteke - gdje nastaje problem?26.04.2006. u 07:59 - pre 219 meseci
Ne razumijem šta želiš reći. U fajl upisujem strukturu:
Citat:
fwrite(&nogometas, sizeof(nogometas), 1, novi);

Taj fajl (700.dat) je bitan. Onaj drugi (nf.txt) je samo za 'usputnu' provjeru i može biti ignoriran. Btw, taj fajl ispada onako kako sam i očekivao. Onaj prvi, koji je jedini bitan, ne izlazi dobro.

Nevjerojatno mi je da prvih 136 zapisa spremi dobro, a onda počne raditi gluposti. Zapravo čini mi se da je greška u tom 136-om zapisu, ali njega još uvijek dobro čita....
http://www.dropbox.com/referrals/NTQ0MTI2NDc5
https://www.agronomija.info/
Failure is not an option. It comes bundled with your Microsoft product.
 
Odgovor na temu

--ja--

Član broj: 4387
Poruke: 232
161.53.76.*

ICQ: 132872590


+3 Profil

icon Re: Datoteke - gdje nastaje problem?26.04.2006. u 08:27 - pre 219 meseci
Aaaa pa ovo je za plakat! Greška je bila:

Citat:
novi = fopen("700.dat", "wb");


Hvala svejedno

[Ovu poruku je menjao --ja-- dana 26.04.2006. u 09:28 GMT+1]
http://www.dropbox.com/referrals/NTQ0MTI2NDc5
https://www.agronomija.info/
Failure is not an option. It comes bundled with your Microsoft product.
 
Odgovor na temu

n1tr0
Freelance
Cortanovci / NS

Član broj: 55279
Poruke: 465
80.93.231.*

Sajt: grubicv.iz.rs


+2 Profil

icon Re: Datoteke - gdje nastaje problem?29.04.2006. u 03:44 - pre 218 meseci
Citat:
n1tr0:
Bolje bi ti bilo da upotrebis binarni zapis


Citat:
--ja--:
Ne razumijem šta želiš reći.. U fajl upisujem strukturu:


Pa rekao sam da sam na brzinu pogledao, a svugde ti je pisalo "w" ili "r", a nigde b.

[Ovu poruku je menjao n1tr0 dana 29.04.2006. u 04:44 GMT+1]
 
Odgovor na temu

--ja--

Član broj: 4387
Poruke: 232
*.mobile.CARNet.hr.

ICQ: 132872590


+3 Profil

icon Re: Datoteke - gdje nastaje problem?29.04.2006. u 08:18 - pre 218 meseci
Citat:
svugde ti je pisalo "w" ili "r", a nigde b

U tome i jest bio problem

[Ovu poruku je menjao --ja-- dana 29.04.2006. u 09:23 GMT+1]
http://www.dropbox.com/referrals/NTQ0MTI2NDc5
https://www.agronomija.info/
Failure is not an option. It comes bundled with your Microsoft product.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Datoteke - gdje nastaje problem?

[ Pregleda: 2519 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

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