C: Upis podataka u binarnu datoteku

Teme vezane za console/GUI programiranje u C/C++ jeziku
4 post(ov)a • Stranica: 1/1.

C: Upis podataka u binarnu datoteku

PostPostao/la displayerror » 01 stu 2015, 00:32

Kako upisati podatke u binarnu datoteku ako broj podataka nije poznat (korisnik može dodavati nove podatke, brisati,...), tj. nema petlje koja će definisati gornje ograničenje.

Sljedeći kod ispisuje samo posljednji unijeti red u datoteku:

c code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
char sifra[8];
char naziv[21];
float kolicina,cijena;
}ARTIKAL;

typedef struct sifra
{ char kljuc[8];
int adresa;
}SIFRA;

typedef struct cvor
{
SIFRA sifra;
struct cvor *lijevi, *desni;
}CVOR;

CVOR* formiraj_cvor(SIFRA *sifra) {
CVOR *novi = (CVOR*)malloc(sizeof(CVOR));
novi->lijevi = novi->desni = 0;
novi->sifra= *sifra;
return novi;
}

CVOR *dodaj_cvor(CVOR *korijen, SIFRA *sifra) {
if (korijen == 0)
return formiraj_cvor(sifra);
if (strcmp(sifra->kljuc, korijen->sifra.kljuc) <= 0)
korijen->lijevi = dodaj_cvor(korijen->lijevi, sifra);
else
korijen->desni = dodaj_cvor(korijen->desni, sifra);
return korijen;
}

void brisi_stablo(CVOR* korijen) {
if (korijen != 0) {
brisi_stablo(korijen->lijevi);
brisi_stablo(korijen->desni);
free(korijen);
}
}

void citaj_artikal(ARTIKAL *art) {
printf(" Sifra: "); scanf("%s", art->sifra);
printf(" Naziv: "); scanf("%s", art->naziv);
printf(" Kolicina: "); scanf("%f", &art->kolicina);
printf(" Cijena: "); scanf("%f", &art->cijena);
}

CVOR* upisi_artikal_u_fajl(ARTIKAL art, FILE *dat, CVOR* korijen) {
SIFRA sifra;
strcpy(sifra.kljuc, art.sifra);
sifra.adresa = ftell(dat);
korijen = dodaj_cvor(korijen, &sifra);
fwrite(&art, sizeof(ARTIKAL), 1, dat);
return korijen;
}

void upisi_sifre_u_fajl(CVOR* korijen, FILE *dat) {
if (korijen != 0) {
fwrite(&korijen->sifra, sizeof(ARTIKAL), 1, dat);
upisi_sifre_u_fajl(korijen->lijevi, dat);
upisi_sifre_u_fajl(korijen->desni, dat);
}
}

int main()
{
CVOR *korijen=0;
char c;
FILE *dat;
ARTIKAL art;
int i;
do
{
printf("=================================================================\n");
printf("Dodavanje [D], Brisanje [B], Prikaz [P], Izmjena [I], Kraj [0]? ");
scanf("\n%c", &c);
if(c == 'D')
{
if((dat=fopen("fajl1.DAT","wb")))
{
printf(" Unesite podatke:\n");
citaj_artikal(&art);
korijen = upisi_artikal_u_fajl(art, dat, korijen);
}
fclose(dat);
}
else if (c != '0')
printf(" Nepoznata opcija - '%c'.\n", c);
}
while(c != '0');
return 0;
}

Re: C: Upis podataka u binarnu datoteku

PostPostao/la Jasko » 01 stu 2015, 09:15

Ako pises ti ove code-ove onda bi te zamolio da ih komentarises. Navikni se odmah da komentarises code-ove, zbog sebe i zbog drugih koji citaju code.

Iskreno, ja nisam bas raspolozen da sam otkrijem svaki detalj koji code radi, pogotov kad se radi o structurama koje su kreacije programera, komentari bi dosta pomogli pri citanju code-a i eventualno, ako brze mogu desifrovat code, a beli vazi i za ostale korisnike foruma, brze ces dobit i zeljenu pomoc.

Npr ako u komentaru procitam da funkcija treba da prikaze citav niz a prikazuje samo zadnji clan, sto je ustvari tvoj problem, sigurno ti mogu brze pomoc.

Pozz
Postoji 10 vrsta ljudi na zemlji. Oni koji razumiju binarni sistem i oni koji ga ne razumiju!
Posjetite moj YouTube kanal za gledanje za programiranje i druge teme oko računara.

Re: C: Upis podataka u binarnu datoteku

PostPostao/la Armin » 01 stu 2015, 10:25

cpp code
if((dat=fopen("fajl1.DAT","wb")))
{
printf(" Unesite podatke:\n");
citaj_artikal(&art);
korijen = upisi_artikal_u_fajl(art, dat, korijen);
}


Mozda da pokušaš izmijeniti kod, da vrtiš petlju kroz fajl, dokle god nije kraj fajla. Nije lako izvodivo, al ima primjera po netu. Evo jedan primjer .
"Ne žalim što su drugi pokrali moje ideje. Žalim što nemaju svoje"
Nikola Tesla

Re: C: Upis podataka u binarnu datoteku

PostPostao/la displayerror » 01 stu 2015, 13:19

@Armin, @Jasko

Ako se u main() pozove funkcija za upis jednog informacionog sadržaja (reda) u fajl, kako onda upisati nepoznat broj redova
tako da se sadržaj ne prebriše?
Kod: Označi sve
CVOR* upisi_artikal_u_fajl(ARTIKAL art, FILE *dat, CVOR* korijen) {
  SIFRA sifra;
  strcpy(sifra.kljuc, art.sifra);
  sifra.adresa = ftell(dat);
  korijen = dodaj_cvor(korijen, &sifra);
  fwrite(&art, sizeof(ARTIKAL), 1, dat);
  return korijen;
}/*upisi JEDAN informacioni sadrzaj (red) u fajl*/


Kod: Označi sve
     if(c == 'D')
     {
         if((dat=fopen("fajl1.DAT","wb")))
         {
             printf("  Unesite podatke:\n");
             citaj_artikal(&art);
             /*while(gornje ogranicenje)? - while(feof(stdin) ne radi)*/
             korijen = upisi_artikal_u_fajl(art, dat, korijen);
             /*ovdje upise jedan info. sadrzaj (red) i prebrise ostale,
             kao ih nema*/
         }
         fclose(dat);
     }


4 post(ov)a • Stranica: 1/1.

Na mreži

Trenutno korisnika/ca: / i 1 gost.