Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Gost
|
|
[Vrh] |
|
Gost
|
|
[Vrh] |
|
Gost
|
|
[Vrh] |
|
Zvone Forumaš(ica)

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


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
Postano: 18:09 ned, 2. 7. 2006 Naslov: |
|
|
probah rjesit 3 zadatak grupe b:
[code:1]
#include <stdio.h>
#include <stdlib.h>
void check(void* p){
if(p==NULL){
printf("greshka!");
exit(1);
}
}
int main(){
int n,p,a,b,i,j;
char **A, polozaj[15];
FILE *in,*out;
in=fopen("crtaj.txt","rt");
check(in);
out=fopen("ploca.txt","wt");
check(out);
fscanf(in,"%d",&n);
A=(char**)malloc(n*sizeof(char*));
check(A);
for(i=0;i<n;i++){
A[i]=(char*)malloc(n*sizeof(char));
check(A[i]);
}
for(i=0;i<n;i++)
for(j=0;j<n;j++){
A[i][j]='.';
}
while(fscanf(in,"%s %d", polozaj, &p)==2){
if(strcmp(polozaj,"vodoravno")==0){
a=p;
for(i=0;i<n;i++)A[i][a]='X';
}
else{
b=p;
for(i=0;i<n;i++)A[b][i]='X';
}
}
for(i=n-1;i>=0;i--){
for(j=n-1;j>=0;j--)fprintf(out,"%c",A[i][j]);
fprintf(out,"\n");
}
for(i=0;i<n;i++)free(A[i]);
free(A);
fclose(in);
fclose(out);
scanf("%%");
return 0;
}
[/code:1]
e sad, problem je u onom kaj on meni ispisuje u datoteci, naime umjesto '.' koju bi mi trebao ispisivati na prazna mjesta, on ispisuje neke znakove, dok 'X' dobro postavi.. :roll:
eni ajdijas?
[color=green]Edit:prebacih sad dio s umetanjem '.' na pocetak.[/color]
probah rjesit 3 zadatak grupe b:
Kod: |
#include <stdio.h>
#include <stdlib.h>
void check(void* p){
if(p==NULL){
printf("greshka!");
exit(1);
}
}
int main(){
int n,p,a,b,i,j;
char **A, polozaj[15];
FILE *in,*out;
in=fopen("crtaj.txt","rt");
check(in);
out=fopen("ploca.txt","wt");
check(out);
fscanf(in,"%d",&n);
A=(char**)malloc(n*sizeof(char*));
check(A);
for(i=0;i<n;i++){
A[i]=(char*)malloc(n*sizeof(char));
check(A[i]);
}
for(i=0;i<n;i++)
for(j=0;j<n;j++){
A[i][j]='.';
}
while(fscanf(in,"%s %d", polozaj, &p)==2){
if(strcmp(polozaj,"vodoravno")==0){
a=p;
for(i=0;i<n;i++)A[i][a]='X';
}
else{
b=p;
for(i=0;i<n;i++)A[b][i]='X';
}
}
for(i=n-1;i>=0;i--){
for(j=n-1;j>=0;j--)fprintf(out,"%c",A[i][j]);
fprintf(out,"\n");
}
for(i=0;i<n;i++)free(A[i]);
free(A);
fclose(in);
fclose(out);
scanf("%%");
return 0;
}
|
e sad, problem je u onom kaj on meni ispisuje u datoteci, naime umjesto '.' koju bi mi trebao ispisivati na prazna mjesta, on ispisuje neke znakove, dok 'X' dobro postavi..
eni ajdijas?
Edit:prebacih sad dio s umetanjem '.' na pocetak.
Zadnja promjena: petrich; 23:01 ned, 2. 7. 2006; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
Postano: 22:14 ned, 2. 7. 2006 Naslov: |
|
|
[quote="vsego"][quote="petrich"]uf, nadjoh glupu greshkicu! :noidea:
sad je ok.. :)[/quote]
Stavi onda aktualno rjesenje (ili editiraj gornji post), jer mi se cini da ce ti jedna greskica ostati... :|[/quote]
uf, ma editirala sam post,samo nisam stavila napomenu.. radi sad,ovak napisan.
vsego (napisa): | petrich (napisa): | uf, nadjoh glupu greshkicu!
sad je ok..  |
Stavi onda aktualno rjesenje (ili editiraj gornji post), jer mi se cini da ce ti jedna greskica ostati...  |
uf, ma editirala sam post,samo nisam stavila napomenu.. radi sad,ovak napisan.
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 22:27 ned, 2. 7. 2006 Naslov: |
|
|
[quote="petrich"]uf, ma editirala sam post,samo nisam stavila napomenu.. radi sad,ovak napisan.[/quote]
Moze i ne raditi. :anishock:
Naime:
[code:1]// Prvi dio:
A=(char**)malloc(n*sizeof(char*));
check(A);
for(i=0;i<n;i++){
A[i]=(char*)malloc(n*sizeof(char));
check(A[i]);
}
// Drugi dio:
while(fscanf(in,"%s %d", polozaj, &p)==2){
if(strcmp(polozaj,"vodoravno")==0){
a=p;
for(i=0;i<n;i++)A[i][a]='X';
}
else{
b=p;
for(i=0;i<n;i++)A[b][i]='X';
}
}
// Treci dio:
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(A[i][j]!='X')A[i][j]='.';
}[/code:1]
U prvom dijelu alociras memoriju. :) To znaci da ti ta memorija "pripada" i da po njoj mozes pisati, ali su vrijednosti jos uvijek neodredjene (tj. "smece" koje se u tom trenutku tamo zateklo). :-s
U drugom dijelu [b]neke[/b] elemente matrice postavljas na [tt]'X'[/tt]; [b]ostale ne diras[/b]. :)
U trecem dijelu [b]citas sve elemente[/b] (dakle i one u koje nisi nista zapisala nakon alokacije memorije) i postavljas na [tt]'.'[/tt] one koji nisu [tt]'X'[/tt]. :?
Eh, da je u onom "smecu" nakon alokacije memorije bio [tt]'X'[/tt] negdje gdje ne smije biti, ti bi dobila krivo rjesenje. :shock:
Dakle, prvo alociraj, zatim [b]sve[/b] inicijaliziraj na [tt]'.'[/tt] i tek na kraju postavljaj [tt]'X'[/tt] tamo gdje treba. ;)
:klopa: ;)
petrich (napisa): | uf, ma editirala sam post,samo nisam stavila napomenu.. radi sad,ovak napisan. |
Moze i ne raditi.
Naime:
Kod: | // Prvi dio:
A=(char**)malloc(n*sizeof(char*));
check(A);
for(i=0;i<n;i++){
A[i]=(char*)malloc(n*sizeof(char));
check(A[i]);
}
// Drugi dio:
while(fscanf(in,"%s %d", polozaj, &p)==2){
if(strcmp(polozaj,"vodoravno")==0){
a=p;
for(i=0;i<n;i++)A[i][a]='X';
}
else{
b=p;
for(i=0;i<n;i++)A[b][i]='X';
}
}
// Treci dio:
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(A[i][j]!='X')A[i][j]='.';
} |
U prvom dijelu alociras memoriju. To znaci da ti ta memorija "pripada" i da po njoj mozes pisati, ali su vrijednosti jos uvijek neodredjene (tj. "smece" koje se u tom trenutku tamo zateklo).
U drugom dijelu neke elemente matrice postavljas na 'X'; ostale ne diras.
U trecem dijelu citas sve elemente (dakle i one u koje nisi nista zapisala nakon alokacije memorije) i postavljas na '.' one koji nisu 'X'.
Eh, da je u onom "smecu" nakon alokacije memorije bio 'X' negdje gdje ne smije biti, ti bi dobila krivo rjesenje.
Dakle, prvo alociraj, zatim sve inicijaliziraj na '.' i tek na kraju postavljaj 'X' tamo gdje treba.
_________________ 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] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
|
[Vrh] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
Postano: 11:50 uto, 4. 7. 2006 Naslov: |
|
|
probala sam rjesiti 2. zadatak s kolokvija grupe B, naravno na radi. :roll:
[code:1]
#include <stdio.h>
#include <stdlib.h>
int *pero(char* src){
int* izlaz;
int temp[100];
int i=0,j;
while(*src!='\0'){
if((*src>='a')&&(*src<='z')){
temp[i]=0;
i++;
src++;
}
else if((*src>='A')&&(*src<='Z')){
temp[i]=1;
i++;
src++;
}
else src++;
}
if(i!=0){
izlaz=(int*)malloc(i*sizeof(int));
for(j=0;j<i;j++){
izlaz[j]=temp[j];
printf("%d",izlaz[j]);
}
return izlaz;
}
else return NULL;
}[/code:1]
dakle, to je f-ija, za glavni program sam stavila ovo:
[code:1]
int main(){
char ulaz[100];
int *izlaz;
printf("unesi ulaz:\n");
scanf("%s",ulaz);
izlaz=pero(ulaz);
printf("%d",izlaz);
free(izlaz);
scanf("%%");
return 0;
}[/code:1]
ne znam da li je greska vec u f-iji ili samo u pozivu iz programa.
probala sam rjesiti 2. zadatak s kolokvija grupe B, naravno na radi.
Kod: |
#include <stdio.h>
#include <stdlib.h>
int *pero(char* src){
int* izlaz;
int temp[100];
int i=0,j;
while(*src!='\0'){
if((*src>='a')&&(*src<='z')){
temp[i]=0;
i++;
src++;
}
else if((*src>='A')&&(*src<='Z')){
temp[i]=1;
i++;
src++;
}
else src++;
}
if(i!=0){
izlaz=(int*)malloc(i*sizeof(int));
for(j=0;j<i;j++){
izlaz[j]=temp[j];
printf("%d",izlaz[j]);
}
return izlaz;
}
else return NULL;
} |
dakle, to je f-ija, za glavni program sam stavila ovo:
Kod: |
int main(){
char ulaz[100];
int *izlaz;
printf("unesi ulaz:\n");
scanf("%s",ulaz);
izlaz=pero(ulaz);
printf("%d",izlaz);
free(izlaz);
scanf("%%");
return 0;
} |
ne znam da li je greska vec u f-iji ili samo u pozivu iz programa.
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 13:40 uto, 4. 7. 2006 Naslov: |
|
|
U funkciji je pogresno to sto si uvela ogranicenje na duljinu rezultata (100 [tt]int[/tt]-ova). :?
Ali, greska ti se javlja jer [tt]int*[/tt] ispisujes s formatom [tt]%d[/tt] (koji sluzi za ispis [tt]int[/tt]-a). 8)
Dobar ispis ovdje ne mozes napraviti jer funkcija ne vraca duljinu nastalog niza. :( Time smo vam htjeli olaksati pisanje same funkcije. O:) Najbolje ju je testirati ovako:
[code:1]int main(){
int *izlaz, i;
izlaz=pero("Dos'o 1 Pero u 12 sati.");
for (i = 0; i < 3; i++) printf("%d ", izlaz[i]);
free(izlaz);
scanf("%%");
return 0;
}[/code:1]
U funkciji je pogresno to sto si uvela ogranicenje na duljinu rezultata (100 int-ova).
Ali, greska ti se javlja jer int* ispisujes s formatom %d (koji sluzi za ispis int-a).
Dobar ispis ovdje ne mozes napraviti jer funkcija ne vraca duljinu nastalog niza. Time smo vam htjeli olaksati pisanje same funkcije. Najbolje ju je testirati ovako:
Kod: | int main(){
int *izlaz, i;
izlaz=pero("Dos'o 1 Pero u 12 sati.");
for (i = 0; i < 3; i++) printf("%d ", izlaz[i]);
free(izlaz);
scanf("%%");
return 0;
} |
_________________ 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] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 16:35 uto, 4. 7. 2006 Naslov: |
|
|
[quote="petrich"]zanima me jos samo kaj sad s tom memorijom koju sam alocirala unutar f-ije. jel da ju oslobodim unutar f-ije?[/quote]
NE! :shock: Ti trebas [b]vratiti[/b] alociranu memoriju... 8)
[quote="petrich"]nekak sam ja to shvatila da ak ju oslobodim prije, da mi nece nis vratit, a ak stavim free nakon returna da se onda nece izvrsit... :?[/quote]
Nije da ti nece vratiti nista; vratit ce ti memoriju koja ti ne pripada i koju u svakom trenutku moze "pregaziti" neki drugi program. :? Ako stavis iza [tt]return[/tt], kako si i rekla, taj [tt]free()[/tt] se nece izvrsiti. 8)
petrich (napisa): | zanima me jos samo kaj sad s tom memorijom koju sam alocirala unutar f-ije. jel da ju oslobodim unutar f-ije? |
NE! Ti trebas vratiti alociranu memoriju...
petrich (napisa): | nekak sam ja to shvatila da ak ju oslobodim prije, da mi nece nis vratit, a ak stavim free nakon returna da se onda nece izvrsit...  |
Nije da ti nece vratiti nista; vratit ce ti memoriju koja ti ne pripada i koju u svakom trenutku moze "pregaziti" neki drugi program. Ako stavis iza return, kako si i rekla, taj free() se nece izvrsiti.
_________________ 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] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
Postano: 21:28 uto, 4. 7. 2006 Naslov: |
|
|
hehe odlicno, al nisi mi bas u potpunosti odgovorio na pitanje (sta s tom alociranom memorijom). :wink:
dakle, sad znam ono sto sam pretpostavljala, da ju ne smijem osloboditi unutar f-ije. :roll: znaci oslobadjam ju unutar maina? da li ce se ona oslobotiti u ovom kodu koji si mi dao za main:
[code:1]
int main(){
int *izlaz, i;
izlaz=pero("Dos'o 1 Pero u 12 sati.");
for (i = 0; i < 3; i++) printf("%d ", izlaz[i]);
free(izlaz);
scanf("%%");
return 0;
}[/code:1]
hehe odlicno, al nisi mi bas u potpunosti odgovorio na pitanje (sta s tom alociranom memorijom).
dakle, sad znam ono sto sam pretpostavljala, da ju ne smijem osloboditi unutar f-ije. znaci oslobadjam ju unutar maina? da li ce se ona oslobotiti u ovom kodu koji si mi dao za main:
Kod: |
int main(){
int *izlaz, i;
izlaz=pero("Dos'o 1 Pero u 12 sati.");
for (i = 0; i < 3; i++) printf("%d ", izlaz[i]);
free(izlaz);
scanf("%%");
return 0;
} |
|
|
[Vrh] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
Postano: 21:43 uto, 4. 7. 2006 Naslov: |
|
|
jos jedna napomena, vezana uz 2.kolokvij. i to 1.zad pod g).
dakle imamo slijedece:
[code:1]
f=fopen("dat.txt","rt");
[/code:1]
gdje je datoteka otvorena za citanje s ovim argumentom mod->"rt".
i kasnije pokusavamo nesto upisati u tu datoteku s:
[code:1]fprintf(f,%d %d %d\n",a[0],a[1],a[2]);[/code:1]
e sad, na prezentaciji rjesenja je receno kako bi prvo datoteku trebalo zatvorit, a nakon toga ponovo otvorit za pisanje, te da nije moguce istovremeno citat iz datoteke i pisat u nju. :shock:
sa:
[b]"w+"[/b] otvaramo/stvaramo text datoteku,s omogucenim operacijama citanja/upis
[b]"r+" [/b]otvaramo text datoteku za citanje/upis
[b]"r+t" [/b]otvaranje text datoteke za citanj/upis
[b]"w+t"[/b] otvaranje/stvaranje text datoteke,omogucene operacije citanja/upisa.
dakle smatram kako bi nesto poput:
[code:1]f=fopen("dat.txt","r+t");[/code:1]
bilo mnogo zgodnije nego zatvaranje datoteke, te naknadno otvaranje. :wink:
jos jedna napomena, vezana uz 2.kolokvij. i to 1.zad pod g).
dakle imamo slijedece:
Kod: |
f=fopen("dat.txt","rt");
|
gdje je datoteka otvorena za citanje s ovim argumentom mod→"rt".
i kasnije pokusavamo nesto upisati u tu datoteku s:
Kod: | fprintf(f,%d %d %d\n",a[0],a[1],a[2]); |
e sad, na prezentaciji rjesenja je receno kako bi prvo datoteku trebalo zatvorit, a nakon toga ponovo otvorit za pisanje, te da nije moguce istovremeno citat iz datoteke i pisat u nju.
sa:
"w+" otvaramo/stvaramo text datoteku,s omogucenim operacijama citanja/upis
"r+" otvaramo text datoteku za citanje/upis
"r+t" otvaranje text datoteke za citanj/upis
"w+t" otvaranje/stvaranje text datoteke,omogucene operacije citanja/upisa.
dakle smatram kako bi nesto poput:
Kod: | f=fopen("dat.txt","r+t"); |
bilo mnogo zgodnije nego zatvaranje datoteke, te naknadno otvaranje.
|
|
[Vrh] |
|
Nesi Inventar Foruma (Moderator)


Pridružen/a: 14. 10. 2002. (14:27:35) Postovi: (E68)16
Spol: 
Sarma: -
|
Postano: 23:32 uto, 4. 7. 2006 Naslov: |
|
|
znala sam da sam nesto zaboravila.... :grrr:
to sto si zadnje napisala, zbilja vrijedi... ali za BINARNE datoteke -a takve niste radili
za textualne, kakve radimo, vrijedi ono sto sam pricala.... a i ti napisala (otvori, zatvori, blabla)
znala sam da sam nesto zaboravila....
to sto si zadnje napisala, zbilja vrijedi... ali za BINARNE datoteke -a takve niste radili
za textualne, kakve radimo, vrijedi ono sto sam pricala.... a i ti napisala (otvori, zatvori, blabla)
_________________ It's not who you love. It's how.
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 23:55 uto, 4. 7. 2006 Naslov: |
|
|
[quote="petrich"]hehe odlicno, al nisi mi bas u potpunosti odgovorio na pitanje (sta s tom alociranom memorijom). :wink:
dakle, sad znam ono sto sam pretpostavljala, da ju ne smijem osloboditi unutar f-ije. :roll: znaci oslobadjam ju unutar maina? da li ce se ona oslobotiti u ovom kodu koji si mi dao za main:
[code:1]int main(){
int *izlaz, i;
izlaz=pero("Dos'o 1 Pero u 12 sati.");
for (i = 0; i < 3; i++) printf("%d ", izlaz[i]);
free(izlaz);
scanf("%%");
return 0;
}[/code:1][/quote]
Pa.... sto bi drugo radio [tt]free(izlaz)[/tt]? :grebgreb:
petrich (napisa): | hehe odlicno, al nisi mi bas u potpunosti odgovorio na pitanje (sta s tom alociranom memorijom).
dakle, sad znam ono sto sam pretpostavljala, da ju ne smijem osloboditi unutar f-ije. znaci oslobadjam ju unutar maina? da li ce se ona oslobotiti u ovom kodu koji si mi dao za main:
Kod: | int main(){
int *izlaz, i;
izlaz=pero("Dos'o 1 Pero u 12 sati.");
for (i = 0; i < 3; i++) printf("%d ", izlaz[i]);
free(izlaz);
scanf("%%");
return 0;
} |
|
Pa.... sto bi drugo radio free(izlaz)?
_________________ 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] |
|
petrich Forumaš(ica)


Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol: 
|
Postano: 7:42 sri, 5. 7. 2006 Naslov: |
|
|
[quote="Nesi"]
to sto si zadnje napisala, zbilja vrijedi... ali za BINARNE datoteke -a takve niste radili
za textualne, kakve radimo, vrijedi ono sto sam pricala.... a i ti napisala (otvori, zatvori, blabla)[/quote]
:? hm, al to i je za otvaranje tekstualnih datoteka (mislila sam da je dovoljno da napisem text).
uglavnom, za otvaranje binarnih su tu:
[b]"r+b"[/b] i [b]"w+b"[/b], a ono sto sam ja napisala se doista odnosi na tekstualne datoteke. 8)
[quote="Vsego"]
Pa.... sto bi drugo radio free(izlaz)? [/quote]
ah... tipkam prije neg razmislim.. :shame:
Nesi (napisa): |
to sto si zadnje napisala, zbilja vrijedi... ali za BINARNE datoteke -a takve niste radili
za textualne, kakve radimo, vrijedi ono sto sam pricala.... a i ti napisala (otvori, zatvori, blabla) |
hm, al to i je za otvaranje tekstualnih datoteka (mislila sam da je dovoljno da napisem text).
uglavnom, za otvaranje binarnih su tu:
"r+b" i "w+b", a ono sto sam ja napisala se doista odnosi na tekstualne datoteke.
Vsego (napisa): |
Pa.... sto bi drugo radio free(izlaz)? |
ah... tipkam prije neg razmislim..
|
|
[Vrh] |
|
Zvone Forumaš(ica)

Pridružen/a: 01. 07. 2003. (13:09:44) Postovi: (9D)16
|
Postano: 18:27 sri, 5. 7. 2006 Naslov: |
|
|
Pomocu "r+" se zaista smije i citati i pisati na text datotekama, ali ispravan rad i nije tako trivijalan (pa nije ni cudo da ga uopce nismo spominjali na vjezbama a i da se u praksi izuzetno rijetko (nikad?) koristi). Evo, npr. zamisli da imamo ovakvu datoteku "nesto.txt":
[code:1]5 6 7
bok!
[/code:1]
Pokusaj bez pokretanja donjeg programa predvidjeti izgled te datoteke u slucaju da je linija oznacena sa // !!!!! komentirana i u slucaju da nije:
[code:1]#include <stdio.h>
int main ( void )
{
FILE *f;
int a;
f=fopen("nesto.txt", "r+");
fscanf (f, "%d", &a); // !!!!!
fprintf (f, "hop!");
fclose(f);
return 0;
}[/code:1]
Dodatni problem je u tome da standard nalaze da se naredbe fscanf i fprintf u bilo kojem poretku ne smiju pozivati jedna direktno iza druge ako se izmedju njih ne nalazi neka od naredbi za pozicioniranje u file-u (rewind, fseek i sl.). Preciznije (ANSI):
[quote]When a file is opened with update mode ('+' as the second or third character in the above list of mode argument values), both input and output may be performed on the associated stream. However, output shall not be directly followed by input without an intervening call to the fflush function or to a file positioning function (fseek, fsetpos, or rewind), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file. Opening (or creating) a text file with update mode may instead open (or create) a binary stream in some implementations.[/quote]
Zadnja recenica jos vise obeshrabruje koristenje r+ ili w+ sa text-datotekama :)
Dakle, ispravak "datoteku treba otvoriti sa f=fopen("bla.txt", "r+")" u podzadatku (g) kolokvija u najboljem slucaju nije bio potpun, trebalo je recimo jos dodati npr. "ispred naredbe fprintf treba pozvati rewind(f)".
Pomocu "r+" se zaista smije i citati i pisati na text datotekama, ali ispravan rad i nije tako trivijalan (pa nije ni cudo da ga uopce nismo spominjali na vjezbama a i da se u praksi izuzetno rijetko (nikad?) koristi). Evo, npr. zamisli da imamo ovakvu datoteku "nesto.txt":
Pokusaj bez pokretanja donjeg programa predvidjeti izgled te datoteke u slucaju da je linija oznacena sa // !!!!! komentirana i u slucaju da nije:
Kod: | #include <stdio.h>
int main ( void )
{
FILE *f;
int a;
f=fopen("nesto.txt", "r+");
fscanf (f, "%d", &a); // !!!!!
fprintf (f, "hop!");
fclose(f);
return 0;
} |
Dodatni problem je u tome da standard nalaze da se naredbe fscanf i fprintf u bilo kojem poretku ne smiju pozivati jedna direktno iza druge ako se izmedju njih ne nalazi neka od naredbi za pozicioniranje u file-u (rewind, fseek i sl.). Preciznije (ANSI):
Citat: | When a file is opened with update mode ('+' as the second or third character in the above list of mode argument values), both input and output may be performed on the associated stream. However, output shall not be directly followed by input without an intervening call to the fflush function or to a file positioning function (fseek, fsetpos, or rewind), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file. Opening (or creating) a text file with update mode may instead open (or create) a binary stream in some implementations. |
Zadnja recenica jos vise obeshrabruje koristenje r+ ili w+ sa text-datotekama
Dakle, ispravak "datoteku treba otvoriti sa f=fopen("bla.txt", "r+")" u podzadatku (g) kolokvija u najboljem slucaju nije bio potpun, trebalo je recimo jos dodati npr. "ispred naredbe fprintf treba pozvati rewind(f)".
|
|
[Vrh] |
|
|