[ Alexandar_d @ 02.04.2005. 17:25 ] @
Imam ovaj code za citanje sadrzaja fajla:

Code:


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

main()
{  
    int buffer[100];
        
    FILE *f;
    
    f = fopen ("c:\\fajl.txt", "r");

   while (fgets (broj, 100, f) != NULL)
   { 
   printf("%s", broj);
   }    
   
   getch();
}



Ovaj mi code cita sadrzaj fajla od pocetka do kraja i prikazuje ga na ekran, medjutim nije mi jasno kako da kada procita sve linije u fajlu, ispise odredjenu liniju u fajlu koju ja zelim?

P.S. Kada mi ispise odredjenu liniju u fajl, tu liniju, odnosno sadrzaj te linije treba da mi spremi u odredjenu varijablu ali posto ce se samo brojevi nalaziti u sadrzaju fajla, da li bez obzira na to moram korisiti funkciju atoi() da konvertujem sadrzaj u cijeli broj?

Hvala.
[ Buffy @ 02.04.2005. 17:51 ] @
Moje rjesenje:
Code:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main()
{
    int i,k=1;
    FILE *dat;
    char string[100];
    printf("Unesite broj linije\n");
    scanf("%d",&i);
    dat=fopen("datoteka.txt","r");
    while(k<i)
        if (fgetc(dat)=='\n') ++k;
    for (i=0;;++i)
    {
        string[i]=fgetc(dat);
        if (string[i]==EOF || string[i]=='\n')
        {
            string[i]='\0';
            break;
        }
    }
    printf("%s",string);
    fclose(dat);
    system("pause");
    return 0;
}

Ovaj program cita znakove iz datoteke ,i kad naidje na znak '\n' povecava se brojac
za jedan sve dok ne dostigne vrijednost zeljene linije teksta.Kada dodje do linije
cita znak po znak iz datoteke i kopira ih u znakovni niz 'string'.Prestaje da kopira znakove
kada naidje na znak '\n' ili EOF.
Poslije program samo ispise sadrzaj niza na ekran.(To je sto je!)
Sto se tice drugog pitanja,naravno da nije potrebno koristiti funkciju itoa,
jer kad dodjes do odredjene linije(na gore objasnjeni nacin) onda samo koristis funkciju fscanf().NA primjer:
Code:

fscanf(dat,"%d",&a);

Nadam se da sam pomogao!
Pozdrav
[ Alexandar_d @ 10.04.2005. 12:05 ] @
Pozdrav,
Ovaj tvoj code mi je pomogao, medjutim ne treba mi bas ovako pa sam ja malo pokusao da modifikujem pa mi nije uspjelo i evo me ovdje.
Naime, treba mi modifikovati onaj gore code koji sam napisao.
Ovaj code koji si ti napisao, on cita odredjenu liniju koju mu ja zadam, medjutim onaj gore moj code on procita CIJELI fajl i ispise sadrzaj cijelog fajla. E umjesto da on ispise sadrzaj cijelog fajla, meni treba da ispise odredjenu liniju. Uglavnom, treba da se nalazi jedna varijabla sadrzaj[100], i code koji cita fajl do kraja != NULL i ide redom, liniju 0 snimi u sadraj[0], liniju 1 snimi u sadrzaj[1] i sve tako do kraja != NULL. I onda ja mogu ispisat odredjenu liniju koja mi treba npr. printf("%s", sadrzaj[2]); a cijeli sadrzaj mogu ispisati petljom. Eto toliko nadam se da cete mi pomoci.
[ X Files @ 10.04.2005. 12:31 ] @
Necu ti modifikovati nikakav kod ali to se u praksi radi ovako:

Code:

// *netestirano* za Borland C++ Builder !!!
TStringList *SL = NULL;
try
{
   try
   {
      SL = new TStringList;
      SL->LoadFromFile( "C:\\file.txt" );

      // ovde mozes da koristis SL kako zelis, na primer:
      
      // SL->Count, je broj ucitanih linija 
      // SL->Strings[ Count-1 ], je poslednja linija
      // SL->Strings[ 0 ], je prva linija
      // SL->Strings[ 0 ][ 1 ], je prvo slovo prve linije
      // SL->Strings[ 0 ][ SL->Strings[ 0 ].Length() ], je zadnje slovo prve linije
      
      // ShowMessage( SL->Strings[ 1 ] ); // ispisuje drugu liniju
      
      // itd ...
      // Posle opet mozes da izmenis neke linije pa ih opet snimis:

      SL->SaveToFile( "C:\\file.txt" );
   }
   catch ( const Exception &e )
   {
      // doslo je do neke greske!!!
   }
}
__finally
{
   if ( SL )
      delete SL;
}


Sve ovo moze da se uradi i sa STL std::string klasom.

Ogranicavati *pamet* programa na fiksni buffer od 100 karaktera je
besmislica sa stanovista kvalitetnog programiranja.
[ X Files @ 10.04.2005. 12:33 ] @
Kao sto rekoh, kod je iz glave - netestiran:

Citat:

// SL->Strings[ Count-1 ], je poslednja linija


treba:

Citat:

// SL->Strings[ SL->Count-1 ], je poslednja linija


Verovatno ima nekih grescica.
[ Buffy @ 10.04.2005. 14:59 ] @
X files ,mozda Alexandar ne poznaje c++,vec samo c.
Dakle Aleksandre trebali kod u c-u ili c++-u.
Pozdrav!
[ X Files @ 10.04.2005. 15:59 ] @
Verovatno si u pravu,

onda mu modifikuj tvoj kod tako da napravis novu f-ju
koja kao argument uzima broj linije koju treba ispisati.
[ Buffy @ 10.04.2005. 17:30 ] @
Code:

#include <stdio.h>
#include <malloc.h>
int main()
{
    char *tekst[100];
    FILE *dat=fopen("datoteka.txt","r");
    int l,k;
    for (l=0;l<=99;l++)
    {
        tekst[l]=(char*)malloc(100);
        k=0;
        while(5>3)
        {
            tekst[l][k]=fgetc(dat);
            if (tekst[l][k]=='\n' || tekst[l][k]==EOF) {tekst[l][k]='\0';break;}
            k++;
        }
        if (tekst[l][k]==EOF) break;
    }
    printf("%s\n",tekst[2]);    
    system("pause");
    return 0;
}

Nadam se da ovo trazis!
Jedina mana ovog programa sto baca memoriju!
Na primjer ako linija ima 3 znaka ostalih 97 bajtova ostaje ne iskoristeno.Isto tako
ako linija ima vise od 100 znakova program moze da pukne.
Dakle,program bi se mogao unaprijediti!
Pozdrav!!!:)

[Ovu poruku je menjao Buffy dana 10.04.2005. u 18:35 GMT+1]
[ Alexandar_d @ 10.04.2005. 17:32 ] @
Treba mi C code, znaci jos jednom da ponovim, treba mi da liniju 1. ispise u npr. sadrzaj[1], liniju 2. u sadrzaj[2] i sve tako do kraja fajla a na kraju da ja mogu ispisati liniju koju ja zelim ovako: printf("Sadrzaj linije 5= %d", sadrzaj[5]);
Puno hvala.
[ Buffy @ 10.04.2005. 19:19 ] @
Pa to sam i napisao u proslom postu!
[ Alexandar_d @ 11.04.2005. 09:34 ] @
Citat:
Buffy: Pa to sam i napisao u proslom postu!



Ja kada sam citao, tog posta nije bilo, radilo se o par minuta :-).

P.S. Pogledaj vrijeme pisanja mog proslog, i tvog predproslog posta.

Sad je sve ok, puno hvala.