Poslao: 05 Nov 2012 21:37
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Imam da uradim jedan zadatak, a on glasi da treba da iz jednog fajla, tekst koji se nalazi u njemu da se taj tekst iskopira u drugi fajl. Ja sam napravio dva fajla i dao im ime. Napravio sam program i onda im ukucam ime onog prvog i ime onog drugog i one se lepo otvore ali se tekst ne iskopira, evo koda:
#include <stdio.h>
#include <stdlib.h>
#define MAXPUT 128
int
main
()
{
int in, on;
char ime1[MAXPUT], ime2[MAXPUT];
FILE *izvorni, *odredisni;
printf("Unesite ime izvornog fajla: ");
gets(ime1);
if(ime1[0] == '\0'){
fprintf(stderr, "Nije uneto ime!");
exit(EXIT_FAILURE);
}
printf("\nUnesite ime odredisnog fajla: ");
gets(ime2);
if(ime2[0] == '\0'){
fprintf(stderr, "Nije uneto ime!");
exit(EXIT_FAILURE);
}
izvorni = fopen(ime1, "r");
if(izvorni == NULL){
fprintf(stderr, "Otvaranje %s nije uspelo", ime1);
exit(EXIT_FAILURE);
}
odredisni = fopen(ime2, "r");
if(odredisni == NULL){
fprintf(stderr, "Otvaranje %s nije uspelo", ime2);
exit(EXIT_FAILURE);
}
while((in = fgetc(izvorni)) != EOF)
putc(in, /*sta treba ovde?*/);
fclose(izvorni);
fclose(odredisni);
return EXIT_SUCCESS;
}
Hvala unapred!
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
|
Poslao: 09 Nov 2012 19:51
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Napisano: 06 Nov 2012 10:40
Citam, ali za ovo putc funkciju, sam znao da treba da ide odredisni, ali nisam bio siguran, pa sam zato ostavio prazno.
Hvala ti puno!
Dopuna: 09 Nov 2012 19:51
Evo da ne otvaram novu temu, nego ovde, posto je vezano za Ulaz, Izlaz i fajlove.
Ima jedan zadatak koji nemogu da resim, on glasi ovako:
Napisite program koji cita tekstualni fajl i daje izvestaj o duzini najduze i najkrace reci i naduzeg i najkraceg reda u fajlu.
Ja dodjem do tamo akd se fajl otvara, mislim na ovo;
pf = fopen(ime, "r");
I dalje nemam predstavu sta treba da se radi.
Nadam se da ce te mi pomoci.
Hvala unapred!
|
|
|
|
Poslao: 09 Nov 2012 23:13
|
offline
- morando
- Građanin
- Pridružio: 19 Maj 2011
- Poruke: 297
|
Mrzi me da objasnjavam a i potrajalo bi sigurno par postova pa cu postaviti ceo kod. Nadam se da je razumljiv, ako ne pitaj slobodno. Happy coding.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 80
int main()
{
size_t brKarakteraUNajduzojReci = 0;
size_t brKarakteraUNajkracojReci = -1;// unsigned int max -1 == 4294967295u
size_t brKarakteraUNajduzojLiniji = 0;
size_t brKarakteraUNajkracojLiniji = -1;// unsigned int max -1 == 4294967295u
size_t brNajduzeLinije = 0;
size_t brNajkraceLinije = 0;
size_t brTrenutneLinije = 0;
char* najduzaRec = NULL;
char* najkracaRec = NULL;
FILE* file = fopen("ulaz.txt", "r");
char buffer[MAX_LINE];
char tokens[] = " ,.';\n";
while(fgets(buffer, MAX_LINE, file) != NULL)
{
++brTrenutneLinije;
size_t len = strlen(buffer);
if(brKarakteraUNajduzojLiniji < len)
{
brKarakteraUNajduzojLiniji = len;
brNajduzeLinije = brTrenutneLinije;
}
if(brKarakteraUNajkracojLiniji > len)
{
brKarakteraUNajkracojLiniji = len;
brNajkraceLinije = brTrenutneLinije;
}
char* pch = strtok(buffer, tokens);
while(pch != NULL)
{
len = strlen(pch);
if(brKarakteraUNajduzojReci < len)
{
if(NULL != najduzaRec)
{
free(najduzaRec);
najduzaRec = NULL;
}
najduzaRec = (char*)malloc(sizeof(char) * len + 1);
memcpy(najduzaRec, pch, len);
najduzaRec[len] = '\0';
brKarakteraUNajduzojReci = len;
}
if(brKarakteraUNajkracojReci > len)
{
if(NULL != najkracaRec)
{
free(najkracaRec);
najkracaRec = NULL;
}
najkracaRec = (char*)malloc(sizeof(char) * len + 1);
memcpy(najkracaRec, pch, len);
najkracaRec[len] = '\0';
brKarakteraUNajkracojReci = len;
}
pch = strtok (NULL, tokens);
}
}
printf("Najduza rec je \'%s\' i ima %u karaktera.\n", najduzaRec, brKarakteraUNajduzojReci);
printf("Najkraca rec je \'%s\' i ima %u karaktera.\n", najkracaRec, brKarakteraUNajkracojReci);
printf("Najduza linija je linija %u i ima %u karaktera.\n", brNajduzeLinije, brKarakteraUNajduzojLiniji);
printf("Najkraca linija je linija %u i ima %u karaktera.\n", brNajkraceLinije, brKarakteraUNajkracojLiniji);
fclose(file);
free(najduzaRec);
free(najkracaRec);
return 0;
}
ulaz.txt
Citat:
Na vr' brda vrba mrda.
Riba ribi grize rep.
Ko jamu kopa fizicki je radnik.
Bez muke nema nauke.
|
|
|
|
Poslao: 10 Nov 2012 10:32
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Ja pola ove funkcije i ove tipove ne koristim i neznam sta su i sta rade, kao sto su: free, size_t, strtok, memcpy, malloc.
A ovu liniju uopste ne razumem: najduzaRec = (char*)malloc(sizeof(char) * len + 1);
Ja stvarno neznam, sto mi dadose ovaj zadatak na kraju, Ulaz, izlaz i fajlove, kad ovo pre toga se nista ne spominje u knjizi. Stvarno ne razumem ovaj kod, nemoras da mi objasnis, sam cu, nego mozes lid a mi das neki link ili nesto, gde mogu da ove funkcije i tipove malo razjasnim.
Ja sam pre nekoliko godina, oko 3, kupio knjigu za programiranje od Denisa Ricija i Brian Kerningana, ali mi je bila komplikovana, pa sam kupio ovu sto sad imam od Augie Hansen, jer je bila laksa, pa imam jos 2 poglavlja da zavrsim(naravno i da razumem, jer do ovde dokle sam dosao, sve razumem), pa cu onda da uzmem ovu od Denisa Ricija da citam i ucim.
Mislim da sam napisao razumljiv tekst, da bih mogao da razumes.
Hvala ti sto hteo da mi odgovoris i potrudio!!
|
|
|
|
Poslao: 10 Nov 2012 11:28
|
offline
- morando
- Građanin
- Pridružio: 19 Maj 2011
- Poruke: 297
|
Ne razumem kako si uopste dosao do ovog zadatka a nisi prosao ove funkcije?
Evo, probacu u detalje da razjasnim:
1.
size_t je tipa unsigned int koji je u dometu brojeva 0 - 4294967295.
Koristimo ovaj tip jer rezlutati promenjljivih ne mogu biti negativni a i slaze se sa tipom povratne vrednosti funkcije strlen posto od nje uzimamo tu vrednost.
2.
malloc rezervise prostor na hipu za reci koja je najduza i najkraca.
Koristimo takozvano dinamicko alociranje zato sto ne znamo unapred velicinu te reci.
malloc za parametar trazi velicinu u bajtima koju ce da rezervise tako da pisem:
(char*) // kastujemo u nas tip
malloc(
sizeof(char) //obicno je 1
* len //duzina trenuutne reci koju smo dobili od strlen funkcije
+ 1 // za null terminating character
3.
free oslobadja memoriju koju smo rezervisali
3.
Ukratko strtok rastura string na delove na kontu delimitera.
while(fgets(buffer, MAX_LINE, file) != NULL)
Znaci uzimamo liniju po liniju iz fajla i tu vrednost drzimo u buffer promenjljivoj pa je prosledjujemo strtok funkciji gde su delimiteri
" ,.';\n" (space, zarez, tacka, apostrof...) i onda tako dobijamo reci razdvojene.
4.
Sa memcpy kopiramo tu rec u nasu promenjljivu da bi je posle prikazali:
if(NULL != najkracaRec) // ako je vec rezervisano a ima krace reci
{
free(najkracaRec);// moramo osloboditi taj prostor da ne bi imali "memory leak"
najkracaRec = NULL;
}
najkracaRec = (char*)malloc(sizeof(char) * len + 1);//rezervisi prostor
memcpy(najkracaRec, pch, len);//iskopiraj na taj prostor
najkracaRec[len] = '\0';// terminisi sa null karakterom
brKarakteraUNajkracojReci = len;
|
|
|
|
Poslao: 10 Nov 2012 13:44
|
offline
- crusher
- Ugledni građanin
- Pridružio: 15 Maj 2012
- Poruke: 396
|
Napisano: 10 Nov 2012 11:43
Neznam ni ja kako, ali nisam prosao to sto sam ti napisao.
Sad, onako, razumem, ne bas najbolje, ali bar malo. Proci cu to i u drugoj knjizi, pa ce biti jasnije.
Ipak, ti hvala sto si se potrudio da mi objasnis, znaci nije da bas ne razumem, razumem, ali, otom potom.
Hvala ti!!
Dopuna: 10 Nov 2012 13:44
Nego, je kad u programu pretisnem enter, to je isto kao '\n'. Je tako ili je nesto drugo?
|
|
|
|