Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Kova Forumaš(ica)


Pridružen/a: 27. 02. 2004. (23:13:50) Postovi: (4B)16
Spol: 
|
Postano: 18:57 čet, 16. 6. 2005 Naslov: koliko rijeci ima u file |
|
|
Danas na usmenom iz c-a profesor mi je postavio pitanje da izbrojim koliko ima rijeci u fileu, rijec je sve sto nije blank, tab ili new line caracter.
ja sam to napravio ovako:
[code:1]#include <stdio.h>
#include <stdlib.h>
int main () {
int br=0;
char ch, temp, datoteka[40];
FILE *fp;
printf("upisite ime datoteke " );
scanf("%s", &datoteka);
fp=fopen(datoteka, "rt");
if (fp== NULL)
{ printf(" Ne mogu otvoriti %s za citanje\n ", datoteka);
exit (1);
}
fscanf(fp, "%c", &ch);
while (ch!= EOF)
{
temp=ch;
fscanf(fp,"%s%*c", &ch);
printf("%c",ch);
if (temp==' ' || temp=='\t' || temp=='\n')
{ if(ch!=temp)
br=br+1;
}
}
printf("broj rijeci u fileu je %d\n", br);
fclose(fp);
return 0;
} [/code:1]
iskompajlirao sam ga , ali mi je kod izvrsavanja ispisivao beskonacno blankova :shock:
profesor mi nije znao reci gdje je greska, bio je preumoran da se jos s time nateze..
kad je on napisao umjesto fscanf, fgetc (fp)radilo je . tj radi kad napisem ovako.
[code:1] temp=' ';
while ((ch=fgetc(fp)!= EOF)
{
printf("%c",ch);
if (temp==' ' || temp=='\t' || temp=='\n')
{ if(ch!=temp)
br=br+1;
} temp=ch;
}[/code:1]
Bi li mi netko mogao objasniti zasto.
Nisam pao, ali sam dobio 4 sto sam odbio.
Danas na usmenom iz c-a profesor mi je postavio pitanje da izbrojim koliko ima rijeci u fileu, rijec je sve sto nije blank, tab ili new line caracter.
ja sam to napravio ovako:
Kod: | #include <stdio.h>
#include <stdlib.h>
int main () {
int br=0;
char ch, temp, datoteka[40];
FILE *fp;
printf("upisite ime datoteke " );
scanf("%s", &datoteka);
fp=fopen(datoteka, "rt");
if (fp== NULL)
{ printf(" Ne mogu otvoriti %s za citanje\n ", datoteka);
exit (1);
}
fscanf(fp, "%c", &ch);
while (ch!= EOF)
{
temp=ch;
fscanf(fp,"%s%*c", &ch);
printf("%c",ch);
if (temp==' ' || temp=='\t' || temp=='\n')
{ if(ch!=temp)
br=br+1;
}
}
printf("broj rijeci u fileu je %d\n", br);
fclose(fp);
return 0;
} |
iskompajlirao sam ga , ali mi je kod izvrsavanja ispisivao beskonacno blankova
profesor mi nije znao reci gdje je greska, bio je preumoran da se jos s time nateze..
kad je on napisao umjesto fscanf, fgetc (fp)radilo je . tj radi kad napisem ovako.
Kod: | temp=' ';
while ((ch=fgetc(fp)!= EOF)
{
printf("%c",ch);
if (temp==' ' || temp=='\t' || temp=='\n')
{ if(ch!=temp)
br=br+1;
} temp=ch;
} |
Bi li mi netko mogao objasniti zasto.
Nisam pao, ali sam dobio 4 sto sam odbio.
_________________ kova
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 19:29 čet, 16. 6. 2005 Naslov: |
|
|
Ovo:
[code:1] fscanf(fp,"%s%*c", &ch); [/code:1]
Ucitava string (dakle [i]n[/i] byteova) u varijablu tipa [tt]char[/tt] (1 byte). :-s Ne znam da li je to uzrok tvog problema, ali je definitivno lose. :(
Ovo:
Kod: | fscanf(fp,"%s%*c", &ch); |
Ucitava string (dakle n byteova) u varijablu tipa char (1 byte). Ne znam da li je to uzrok tvog problema, ali je definitivno lose.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
Kova Forumaš(ica)


Pridružen/a: 27. 02. 2004. (23:13:50) Postovi: (4B)16
Spol: 
|
Postano: 19:59 čet, 16. 6. 2005 Naslov: |
|
|
ja mislim da sam napravio beskonacnu petlju :oops: .
[code:1]fscanf(fp, "%c", &ch);
while (ch!= EOF)
{
temp=ch;
fscanf(fp,"%c%*c", &ch); [/code:1]
dakle ja sam prvo ucitao jedan znak onda sam provjerio da li je taj znak razlicit od EOF (uvjet while petlje) ,ali kad dodjem do kraja filea fscanf mi nece nista staviti u ch jer nije nista procitao, pa je uvjet ch!= EOf besmislen , jer je ch uvijek razlicit od EOF . Trebao sam staviti
while ( (fscanf(fp, "%c", &ch)!=0) jer fscanf vraca broj ucitanih parametara a kad dodje do kraj filea nece procitati nista , vec ce vratiti nula.
sto uopce znaci %*c ?
na vjezbama u petak nam je receno da ce to "ucitati neki znak i baciti ga u smece". Asistent je rekao da moze i bez toga ak se dobro sjecam. Mislim da je to reko kada smo obradjivali vjezbe 12 74a___file_copy jer se tamo prvi puta pojavljuje taj znak.
Krivo pretipkah s papira mora biti fscanf (fp," %c" &ch) tak sam napiso i na usmenom .
ja mislim da sam napravio beskonacnu petlju .
Kod: | fscanf(fp, "%c", &ch);
while (ch!= EOF)
{
temp=ch;
fscanf(fp,"%c%*c", &ch); |
dakle ja sam prvo ucitao jedan znak onda sam provjerio da li je taj znak razlicit od EOF (uvjet while petlje) ,ali kad dodjem do kraja filea fscanf mi nece nista staviti u ch jer nije nista procitao, pa je uvjet ch!= EOf besmislen , jer je ch uvijek razlicit od EOF . Trebao sam staviti
while ( (fscanf(fp, "%c", &ch)!=0) jer fscanf vraca broj ucitanih parametara a kad dodje do kraj filea nece procitati nista , vec ce vratiti nula.
sto uopce znaci %*c ?
na vjezbama u petak nam je receno da ce to "ucitati neki znak i baciti ga u smece". Asistent je rekao da moze i bez toga ak se dobro sjecam. Mislim da je to reko kada smo obradjivali vjezbe 12 74a___file_copy jer se tamo prvi puta pojavljuje taj znak.
Krivo pretipkah s papira mora biti fscanf (fp," %c" &ch) tak sam napiso i na usmenom .
_________________ kova
|
|
[Vrh] |
|
Zvone Forumaš(ica)

Pridružen/a: 01. 07. 2003. (13:09:44) Postovi: (9D)16
|
Postano: 20:18 čet, 16. 6. 2005 Naslov: |
|
|
Da, scanf ("%*c"); ili scanf("%*d"); ili nesto slicno znaci da se ono sto fja scanf procita ne zelimo spremiti u varijablu, vec jednostavno ignoriramo i preskacemo kod ucitavanja.
Inace, prebrojavanje broja rijeci u datoteci se moze rijesiti ovako nekako:
[code:1]while (fscanf (f, "%*s") != EOF)
broj_rijeci++;
[/code:1]
Kad scanf ucitava sa bilo cime osim sa %c, preskace sve praznine na koje naidje, sve do prvog ne-praznina znaka.
Da, scanf ("%*c"); ili scanf("%*d"); ili nesto slicno znaci da se ono sto fja scanf procita ne zelimo spremiti u varijablu, vec jednostavno ignoriramo i preskacemo kod ucitavanja.
Inace, prebrojavanje broja rijeci u datoteci se moze rijesiti ovako nekako:
Kod: | while (fscanf (f, "%*s") != EOF)
broj_rijeci++;
|
Kad scanf ucitava sa bilo cime osim sa %c, preskace sve praznine na koje naidje, sve do prvog ne-praznina znaka.
|
|
[Vrh] |
|
shokre Forumaš(ica)


Pridružen/a: 11. 05. 2003. (20:05:09) Postovi: (4A)16
Spol: 
|
|
[Vrh] |
|
Zvone Forumaš(ica)

Pridružen/a: 01. 07. 2003. (13:09:44) Postovi: (9D)16
|
|
[Vrh] |
|
|