[ Mix5 @ 16.06.2006. 23:42 ] @
Imam funkciju koja prima pokazivac na fajl a vraca pokazivac na string koji u glavnom programu koristim za smestanje u strukturu od koje pravim listu. Fajl se sastoji iz vise redova.

Funkcija treba da se pozove onoliko puta koliko fajl ima redova teksta. Moje pitanje je kako da pri sledecem pozivu funkcije ona cita sedeci red teksta i kako da znam koliko puta vrsim pozivanje funkcije. Znam da trebam da citam podatke iz fajla dok ne dodjem do kraja fajla ali ne znam kako to da napisem.

Code:

char *CitajIzFajla(FILE *file)
{
     char *inf;
     inf = malloc(MAX_DUZ);
     fgets(inf, MAX_DUZ, file);
     return inf;
}
[ z@re @ 17.06.2006. 01:12 ] @
Kad otvoris datoteku preko fopen();, kreira se lokator koji sluzi za pozicioniranje lokacije za iscitavanje i upisivanje. Taj lokator mozes rucno micat pomocu fseek(); funkcije. Uglavnom, kad fgets iscita jednu liniju, automatski se lokator mice na drugu liniju. Tvoju funckiju mozes zvat na nacin :

Code:

char *linija;
if(!feof(ulazna)) linija = CitajIzFilea(ulazna);


[ Mix5 @ 17.06.2006. 01:55 ] @
Mislis

Code:

char *linija;
while(!feof(ulazna)) linija = CitajIzFilea(ulazna);


Meni je ovako logicnije.
[ Mali Misha @ 17.06.2006. 06:49 ] @
Čitanje fajla liniju po liniju... i pamćenje. Preporučujem da funkcija koja uzima liniju vraća pokazivač na NULL ukoliko se došlo do kraja fajla.

Code:
char* getline(FILE *fp)
{
    // ... pokusaj citanja fajla i pisanje null na kraj ucitanog stringa

    if(feof(fp) && <string prazan>) return 0;

    // ...
}

int main(void)
{
    char *line;
    FILE *fp;

    // ...

    while( line = getline(fp) )
    {
        // ...
    }

    // ...

}

Inače ako štediš na memoriji, bolje bi bilo da napraviš bafer maksimalne dužine u funkciji koja poziva getline i onda u getline prvo učitaš liniju u taj bafer. Dužina učitavane linije će biti poznata u trenutku kada završiš sa njenim čitanjem. Nakon toga napraviš novi string tačno te dužine plus 1, zbog NULL na kraju, i prepišeš bafer u taj string.
[ tosa @ 17.06.2006. 08:30 ] @
Ja bih ti savetovao da staviš pokazivač na string kao argument funkcije, kao i dužinu istog, a da
menadžment memorije radiš u ostatku programa - mnogo je razloga za ovakav pristup.
[ z@re @ 17.06.2006. 19:44 ] @
Citat:
Mix5: Mislis

Code:

char *linija;
while(!feof(ulazna)) linija = CitajIzFilea(ulazna);


Meni je ovako logicnije.


Ma da, typo. Treba while.
[ X Files @ 17.06.2006. 20:05 ] @
Pazi kad sam juce 2 min gledao u cemu je razlika izmedju te dve linije (tj. da vidim na sta se
primedba odnosi), i nisam uspeo da uocim da je na jednom mestu 'if' a na drugom 'while'... :)
[ n1tr0 @ 17.06.2006. 23:05 ] @
Citat:
X Files: Pazi kad sam juce 2 min gledao u cemu je razlika izmedju te dve linije (tj. da vidim na sta se
primedba odnosi), i nisam uspeo da uocim da je na jednom mestu 'if' a na drugom 'while'... :)

Auuuuu...
Pa dobar si ti...
Ja sam proveo oko 10min i jos krenuo da kucam poruku da pitam koja je razlika, a kada sam citirao... :)
[ z@re @ 18.06.2006. 02:54 ] @
I meni je trebalo jedno par puta usporedbe da skuzim svoj lapsus ;)

[ Mix5 @ 19.06.2006. 04:44 ] @
Ovo mi je samo kod za testiranje, nebi da kacim kod onoga sto pravim, ima mnogo.

Zasto mi ne radi citanje iz fajla... ne mogu vise da se mucim...

Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_DUZ 200

typedef struct elementListe
{
        char *infixizraza;
        struct elementListe *next;
}       ElementListe;

typedef struct lista
{
        struct elementListe *prvi;
        struct elementListe *poslednji;       
}       Lista;

ElementListe *NapraviElement(char *infix)
{
             ElementListe *e;
             e = malloc(sizeof(ElementListe));
             e -> next = NULL;
             e -> infixizraza = malloc(strlen(infix)+1);
             strcpy(e -> infixizraza, infix);
             return e;
}

Lista *NapraviListu()
{
      Lista *l;
      l = malloc(sizeof(Lista));
      l-> prvi = NULL;
      l-> poslednji = NULL;
      return l;
}

void DodajUListu(Lista *l, ElementListe *e)
{
     if(!l->prvi) l->prvi = e;
     else      l->poslednji->next = e;
     l->poslednji = e;
              
}

void IspisiListu(Lista *l)
{
     ElementListe *pom = l->prvi;
     while(pom){puts(pom->infixizraza);pom = pom->next;}
}

int DuzinaListe(Lista *l)
{
     int br=0;
     ElementListe *pom = l->prvi;
     while(pom){br++;pom = pom->next;}
     return br;
}

void UpisiUFajl(Lista *l, char imefajla[1000])
{
     FILE *fajl;
     fajl = fopen(imefajla,"a+");
     ElementListe *pom = l->prvi;
     while(pom){
     fprintf(fajl,"%s\n",pom->infixizraza);
     pom = pom->next;
     }
     fclose(fajl);
}

void CitajIzFajla(Lista *l, char imefajla[1000])
{
     FILE *fajl;
     char *inf;
     if ((fajl = fopen(imefajla,"r")) == NULL)
     {
     printf("Fajl ne postoji !\n");return 0;
     }
     fajl = fopen(imefajla,"r");
     while(feof(fajl))
     {
     inf = malloc(MAX_DUZ);
     fgets(inf, MAX_DUZ, fajl);
     DodajUListu(l,NapraviElement(inf));
     }  
}

main () 
{
        Lista *lista;
        int a=0;
        char ime[1000];
        
        lista = NapraviListu();
        printf("%d\n", DuzinaListe(lista));
        
        printf("Unesite ime fajla: ");scanf("%s", ime);
        CitajIzFajla(lista,ime);
  
        IspisiListu(lista);
        printf("%d", DuzinaListe(lista));

        system("PAUSE");
        
}
[ Igor Gajic @ 19.06.2006. 10:40 ] @


Code:

     if ((fajl = fopen(imefajla,"r")) == NULL)
     {
     printf("Fajl ne postoji !\n");return 0;
     }


     fajl = fopen(imefajla,"r");       //!!!!!!!!!!!!!!!!!!!!!!


Zar vec nisi otvorio fajl?

I

Code:

 while(feof(fajl))


bi trebalo da bude

Code:

 while(!feof(fajl))