.bin datoteke i c problem

poruka: 2
|
čitano: 1.345
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
11 godina
neaktivan
offline
.bin datoteke i c problem

uglavnom, ovdje su tri programa, prvi bi trebao prepisati sadržaj txt datoteke u .bin, drugi bi sadržaj .bin datoteke trebao sortirati, a treći bi sadržaj .bin datoteke trebao ispisati na zaslon.

drugi program bi trebao biti skroz točan jer ga je napisao profesor, ova druga dva programa su moj uradak, kada pokrenem prvi javi mi segmentation fault  (core dumped), ali ipak napravi .bin datoteku, drugi program se pokrene bez poteškoća, a treći mi na zaslon ispiše smeće (samo hrpu nula)

 

#include<stdio.h>
main()
{
typedef struct {
    int id_broj;
    char naziv[32];
    char oznaka;
    double vrijednost;
    } zapis;
FILE *u, *i;
int n;
zapis *z=malloc(sizeof(zapis));
u=fopen("zapis.txt","r");    if(!u) return;
i=fopen("zapisi.bin","wb");
/*
for (n=0;n<4;n++) {
    fscanf(u, "%d %s %c %lf", z->id_broj, z->naziv, z->oznaka, z->vrijednost);
    fwrite(z, sizeof(zapis), 1, i);
    }    */
while (fscanf(u, "%d %s %c %lf", z->id_broj, z->naziv, z->oznaka, z->vrijednost)==4)
    fwrite(z, sizeof(zapis), 1, i);
fclose(u);
fclose(i);
}

 

 

#include <stdio.h>
#include <stdlib.h>
typedef struct {
int id_broj;
char naziv[32];
char oznaka;
double vrijednost;
} zapis;
int cmp_silazno_naziv( zapis* a, zapis* b )
{
    return -strcmp( a->naziv, b->naziv );
}
main()
{
    FILE* f = fopen( "zapisi.bin", "r+b" ); if( !f )exit(1);
    fseek( f, 0, SEEK_END );
    long size = ftell( f );
    long N = size / sizeof( zapis ); if( N * sizeof( zapis ) != size )exit(1);
    fseek( f, 0, SEEK_SET );
    zapis *z = malloc( size );
    fread( z, sizeof(zapis), N, f );
    qsort( z, N, sizeof(zapis),(int(*)(const void*,const void*))cmp_silazno_naziv );
    fseek( f, 0, SEEK_SET );
    fwrite( z, sizeof(zapis), N, f );
    free(z);
    fclose(f);
    return 0;
}

 

 

#include <stdio.h>
#include <string.h>
main()
{
FILE *b;
typedef struct {
    int id_broj;
    char naziv[32];
    char oznaka;
    double vrijednost;
    } zapis;
int N;
b=fopen("zapisi.bin", "r");
zapis *p=malloc(sizeof(zapis));
/*    for (N=0;N<4;N++){
       fread(p,sizeof(zapis),1,b);
       printf("%d %s %c %lf\n", p->id_broj,p->naziv,p->oznaka,p->vrijednost);
       }      */
    while (fread(p,sizeof(zapis),1, b)==1)
       printf("%d %s %c %lf\n", p->id_broj,p->naziv,p->oznaka,p->vrijednost);
    fclose (b);   
}

 

tek sam počeo raditi ovo gradivo i nije mi baš najjasnije, a nemam nikakvih materijala iz kojih bi mogao naučiti pa sve otkrivam metodom pogrešaka i pokušaja, volio bih znati zašto ovo ne radi i što radim krivo u tome i ako netko ima kakvu dobru skriptu ili nešto iz koje bi mogao više doznati bio bi zahvalan?

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: .bin datoteke i c problem

Tu mi je sumljivo dosta stvari, a pogotovo fread i fwrite. Fale castovi pointera prije malloc i sl. stvari. Evo ti primjeri jednog zadatka koji piše i čita iz binarne datoteke pa ga probaj proučiti:

 

U direktnu neformatiranu datoteku podaci.bin se spremaju podaci o stanju skladišta neke tvrtke. Struktura zapisa je sljedeća: Ime artikla (30+1), Proizvođač (30+1), Količina (int). Treba napisati program koji zapisuje N zapisa u datoteku, a zatim ispisuje sve zapise u datoteci.

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

struct zapis{    // struktura jednog zapisa
    char artikl[30+1];
    char proiz[30+1];
    long kolicina;
}temp;

int main(){
    char* dat = "podaci.bin";
    int i, n ,br;
    FILE *f;

    if((f = fopen(dat, "a+b"))==NULL){    // otvori binarno!
       printf("Datoteka se ne moze otvoriti!");
       return;
    }
    printf("Broj zapisa: ");
    scanf("%d", &n);

    for(i = 1; i <= n; i++){
       printf("\nIme artikla: ");
       scanf("%s", temp.artikl);
       printf("Proizvođač: ");
       scanf("%s", temp.proiz);
       printf("Količina: ");
       scanf("%d", &temp.kolicina);    
       fwrite(&temp, sizeof(temp), 1, f);
    }
    br = ftell(f)/sizeof(temp);
    rewind(f);

    // procitaj i ispisi sve postojece zapise u datoteci
    printf("\n\n%s:\n\n", dat);
    for(i = 1; i <= br; i++){
       fread(&temp, sizeof(temp), 1, f);
       printf("Ime artikla: %s\t", temp.artikl);
       printf("Proizvođač: %s\t", temp.proiz);
       printf("Količina: %d\n", temp.kolicina);
    }
    fclose(f);
    return 0;
}

Kada lajavci laju onda završe ovako: http://i471.photobucket.com/albums/rr77/toropreto/2012-07-0813_30_07.gif
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice