Stranica: 1/1.

[C] Programiranje - zadatak

Postano: 16 sij 2013, 15:17
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;
}

Re: Programiranje u C - zadatak

Postano: 16 sij 2013, 17:37
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

Re: Programiranje u C - zadatak

Postano: 16 sij 2013, 18:10
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

Re: Programiranje u C - zadatak

Postano: 16 sij 2013, 18:30
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

Re: Programiranje u C - zadatak

Postano: 16 sij 2013, 18:35
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

Re: Programiranje u C - zadatak

Postano: 19 sij 2013, 19:11
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;
}

Re: Programiranje u C - zadatak

Postano: 19 sij 2013, 22:40
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.