// domaci zadatak
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//struktura
typedef struct transakcija {
char* prviRacun;
char* drugiRacun;
float iznos;
} Transakcija;
typedef struct elem {
Transakcija t;
struct elem* sledeci;
} Elem;
typedef struct racuni {
char* racun;
float balans;
struct racuni* sledeci;
} Racuni;
// prva lista -> pocetni racuni sa pocetnim balansom
// 1. racun - balans
// 2. racun - balans
// 3. racun - balans
// druga -> krajnji balans i sortirani
// ponistena
// funkcija koja ce da kreira jednostruko ulancanu listu
Elem* kreira_listu(FILE* dat) {
Elem* glava = NULL, * rep = glava, * tmp;
Transakcija t;
// proverava da li postoji datoteka
if (!dat) {
printf("DAT_GRESKA");
exit(0);
}
char c, * linija = calloc(1,sizeof(char));
//1 char
int trenBrojElemLinije = 0;
// dohvata karakter po karakter u redu dok ne dodje do kraja file
while ((c = fgetc(dat)) != EOF) {
trenBrojElemLinije++;
//1
linija = realloc(linija, (trenBrojElemLinije+1) * sizeof(char));
// 1 char
linija[trenBrojElemLinije - 1] = c;
linija[trenBrojElemLinije] = '\0';
if (c == '\n') {
linija[trenBrojElemLinije-1] = '\0';
trenBrojElemLinije = 0;
//OBRADA LINIJE I PRONALAZENJE PRVOG I DRUGOG ZIRORACUNA
char* strelica = strstr(linija, "->");
char* dveTacke = strstr(linija, ":");
if (strelica != NULL && dveTacke != NULL && strelica < dveTacke) {
*strelica = '\0';
*dveTacke = '\0';
// IZDVAJANJE PRVOG STRINGA
int DuzPrvogRac = strelica - linija;
char* prviZiro = calloc((DuzPrvogRac + 1) , sizeof(char));
strncpy(prviZiro, linija, DuzPrvogRac);
prviZiro[DuzPrvogRac] = '\0';
t.prviRacun = prviZiro;
// IZDVAJANJE DRUGOG STRINGA
int DuzDrugogRac = dveTacke - (strelica + 4);
char* drugiZiro = calloc((DuzDrugogRac + 1) , sizeof(char));
strncpy(drugiZiro, strelica + 4, DuzDrugogRac);
drugiZiro[DuzDrugogRac] = '\0';
t.drugiRacun = drugiZiro;
// ZAPISIVANJE PRENESENOG NOVCA
t.iznos = atof(dveTacke + 2);
linija = realloc(linija, 0);
}
tmp = malloc(sizeof(*tmp));
if (!tmp) exit(1);
tmp->t = t;
tmp->sledeci = NULL;
if (!glava) glava = tmp;
else rep->sledeci = tmp;
rep = tmp;
}
}
return glava;
}
//funkcija koja ce da vrsi obradu ulancane liste
// funkcija koja ce da vrsi ispisivanje u novu datoteku zadatu sa argv[2]
void ispisi_i_oslobodi(Elem* glava, FILE* dat) {
Elem* stari;
while (glava) {
fprintf(dat, "%s %s %.2f\n", glava->t.prviRacun, glava->t.drugiRacun, glava->t.iznos);
stari = glava;
glava = glava->sledeci;
free(stari);
}
}
int main(int argc, const char* argv[]) {
if (argc != 4) return 0;
double PstanjeRacuna;
PstanjeRacuna = atof(argv[3]);
FILE* ulazna = fopen(argv[1], "r");
Elem* glava = kreira_listu(ulazna);
fclose(ulazna);
FILE* izlazna = fopen(argv[2], "w");
ispisi_i_oslobodi(glava, izlazna);
fclose(izlazna);
return 0;
}