Problem kod zadatka u Ulaz i izlaz

Problem kod zadatka u Ulaz i izlaz

offline
  • 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.
offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

1. Umesto "r" (read) treba da stavis "w" (write)
//odredisni = fopen(ime2, "r"); odredisni = fopen(ime2, "w");

2. Treba da stavis handle fajla:
putc(in, odredisni/*sta treba ovde?*/);

Citas li ti uopste dokumentaciju funkcija koje koristis?



offline
  • 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!

offline
  • 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.

offline
  • 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!!

offline
  • 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;

offline
  • 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?

Ko je trenutno na forumu
 

Ukupno su 930 korisnika na forumu :: 30 registrovanih, 6 sakrivenih i 894 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 8u47, A.R.Chafee.Jr., aramis s, babaroga, Bobrock1, cavatina, ccoogg123, cenejac111, djboj, FOX, goxin, JOntra, Kazablankasrb, leonard, MB120mm, mercedesamg, mikrimaus, milutin134, MiroslavD, moldway, nenad81, ObelixSRB, oldtimer, procesor, Shinobi, Silvertooth, styg, tubular, voja64, wizzardone