[C] Programiranje - zadatak

C, C++, Java, PHP, Ruby...

Moderator/ica: Moderatori/ce

Pravila foruma
U naslovu teme unutar uglatih zagrada navesti o kojem jeziku je riječ. Primjer: [Java]
Odgovori
Avatar
MarinX
Postovi: 48
Pridružen/a: 27 stu 2012, 14:41
Spol: M
OS: Ubuntu 13.04
Lokacija: Zagreb

[C] Programiranje - zadatak

Post Postao/la MarinX »

Pozdrav svima,
Imam naime problem kod jednog zadatka kojeg trebam rjesiti.

Imam datoteku Bodovi.dat koju treba procitat.
Napravim strukturu, ucitam dadoteku i kada treba ispisati, dobim nekakav žnj podatak.

Informacije o zadatku:
Bodovi.dat je binarna datoteka koja se sastoji od podataka o
svakom studentu za razne elemente ocjene. Svaki zapis se
sastoji od točno 8 byte-ova
– 1 byte (8 bitova) – šifra ispita (unsigned char)
– 6 byte (48 bitova) – šifra studenta (poslana u mailu)
– 1 byte (8 bitova) – postignut broj bodova na tom ispitu (unsigned
char)

Program od korisnika mora tražiti unos šifre studenta (6
znakova), te ispisati rezime bodova studenta u datoteku
rezultat.txt u sljedećem formatu

Ja predam sifru studenta i sifru ispita, al kad mi treba ispisati bodovi, onda C program poludi !
Bitno mi je samo da dobro procita i ispise na konzolu pravilan podatak, ostalo cu znat rjesiti, bas sam zapeo na pocetku xD
Gdje ja zapravo grjesim?
U samom programu je test s podacima koji se nalaze u datoteci Bodovi.dat

Kod: Označi sve

typedef struct{
        unsigned char sifra[1+1];
        unsigned char student[6+1];
        unsigned char bodovi[1+1];
        
        }Osoba;
int main(int argc, char *argv[])
{
        Osoba o2;
        int len,len2;
        
        unsigned char test_student[6+1]={"53775A"};
        unsigned char test_sifra[1+1]={"15"};
        len = strlen(test_student);
        len2 = strlen(test_sifra);
        
        FILE* fin = fopen("Bodovi.dat", "rb");
        
        fseek(fin, sizeof(Osoba) * (len-1)*(len2-1), SEEK_SET); 
        fread(&o2, sizeof(Osoba), 1, fin);
        
        printf("%s\n",o2.bodovi); 
    
        fclose(fin);
        
  system("PAUSE");	
  return 0;
}
Avatar
ante003
Postovi: 664
Pridružen/a: 11 tra 2010, 16:35
Spol: M
OS: Arch

Re: Programiranje u C - zadatak

Post Postao/la ante003 »

ne sjecam se vise tocno kako fseek i fread funkcioniraju ali podosta sam siguran da ti ne radi ova linija za fread jer ne mozes poslati strukturu kao argument u koji ce se nesto procitano spremati. mozes poslati int, string i sl ali podosta sam siguran da ne moze ici struktura
Avatar
MarinX
Postovi: 48
Pridružen/a: 27 stu 2012, 14:41
Spol: M
OS: Ubuntu 13.04
Lokacija: Zagreb

Re: Programiranje u C - zadatak

Post Postao/la MarinX »

Al pazi ovaj dio sada...imam drugu datoteku s podacima i nju mi normalno hoce procitat i isprintat na konzolu:

Kod: Označi sve

while(fread(&z1,sizeof(Zadatak),1,fin)==1){
      printf("%d\t %-13s %d\n",z1.redni_broj, z1.naziv,z1.iznos);
Znaci, ide sve dok ne nadje na kraj i sve datoteke .dat ovaku mi funkcioniraju osim ove, stvarno sam szbunjen
Avatar
Medojedni jazavac
Postovi: 1536
Pridružen/a: 22 tra 2012, 08:55
Spol: M
OS: eOS Luna
Lokacija: ForHill Croatia
Kontakt:

Re: Programiranje u C - zadatak

Post Postao/la Medojedni jazavac »

ne salje strukturu nego poniter na strukturu. nemam sad bas vremena detaljno gledat, ali primjecujem da ti neka polja zauzimaju vise mjesta nego kaj si navel da trebaju zauzimat
stefan je napisao/la:tu mač gemišta
To understand recursion, you must first understand recursion.
Avatar
MarinX
Postovi: 48
Pridružen/a: 27 stu 2012, 14:41
Spol: M
OS: Ubuntu 13.04
Lokacija: Zagreb

Re: Programiranje u C - zadatak

Post Postao/la MarinX »

Nadodao sam u privitku datoteku u zip-u, pa ako ce netko imat vise vremena, neka je proba otvoriti i izlistati podatke.
Ja pokusavam i dalje, al opet dobivam neke cudne znakove i ne citljive podatke
Privitak/ci
Bodovi.zip
(4.3 KiB) Preuzeto 230 puta.
Avatar
Medojedni jazavac
Postovi: 1536
Pridružen/a: 22 tra 2012, 08:55
Spol: M
OS: eOS Luna
Lokacija: ForHill Croatia
Kontakt:

Re: Programiranje u C - zadatak

Post Postao/la Medojedni jazavac »

Kaj se tice tvog koda, moras paziti kad postavljas velicinu varijabli i polja da bude u skladu sa zadatkom.

Lijepo si navel 1byte + 6 bytea + 1 byte, a ti svakom u strukturi dodajes jos jedan byte. Tu ti je jedna greska, jer ce ti pointer skakati po datoteci u prevelikim zalogajima, a jos ce ti se krivo prekopirat, jer se iz binarnih datoteka sve lijepi direktno u memoriju.

Pregledal sam datoteku i nasel sam meni dosta nelogicnih stvari. Ovi bodovi uopce nisu vrijednosti koji bi trebali prikazivat bodove, vec neki random znakovi. U pocetku je imalo smisla dodati broj 48 jer su bili brojevi od 0-10, pa bi se time ispisivali brojevi.

Evo ti moj program koji ti ispisuje neki sadrzaj datoteke, koji je [sadrzaj] meni dosta nelogica:

Kod: Označi sve

#include <stdio.h>

typedef unsigned char uchar;

typedef struct {
    char sifra_ispita;
    char sifra_studenta[6];
    char bodovi;	
} stud_ispit;

#define OVER_AND_OUT 1

int main(void) {
	stud_ispit si;

	FILE *ispit_stream = fopen("Bodovi.dat", "r"); //Ak ne koristis windowze 'b' nije potrebno
	
	//fseek(ispit_stream, sizeof(stud_ispit) * 11, SEEK_SET);
	int j;
	for(j = 0; j < 15; j++) {
		fread(&si, sizeof(stud_ispit), 1, ispit_stream);
		printf("%c\n", si.sifra_ispita + 65);
		int i;
		for(i = 0; i < 6; i++) {
			printf("%c", si.sifra_studenta[i]);
		}
		printf("\n%c\n", si.bodovi + 48);
	}
	fclose(ispit_stream);

	return OVER_AND_OUT;
}
stefan je napisao/la:tu mač gemišta
To understand recursion, you must first understand recursion.
Avatar
jurastublic
Postovi: 1907
Pridružen/a: 16 tra 2011, 08:34
Spol: M
OS: Mint 10 LXDE itd...
Lokacija: i grupa Film

Re: Programiranje u C - zadatak

Post Postao/la jurastublic »

Medo, ovako na brzinu, i ja sam pogledao tu datoteku i također, nije logično. Tko zna kako je upisana ali sigurno nije onako kao što marinx kaže (nakon prvih 5 zapisa ide ascii "/XXXXXX " (zadnji je space)). Dragi Bog zna šta su X-ovi . Ali u onome da dodaje jedan byte nije problem jer isti taj byte oduzima na (len-1)*(len2-1). Daj marinx, pokaži tu drugu datoteku koja ti radi ispravno.
"Hodor bre foobar"
Odgovori