PDA

Tam Sürümünü Görmek İçin : C de dosya işlemleri


kejya
14/05/2007, 00:05
arkadaşlar bir text dökümanı oluşturdum.İçinde şu şekilde sayılar var

15
56
89
63
63
87
45
12

programın buradaki sayıları bir array da tutması gerekiyor
böyle bir kod yazdım ama sorun var!
ben sorunu bulamıyorum
bakabilir misiniz ?


#include<stdio.h>
#include<stdlib.h>
int s[8]={0};
int main()
{
FILE *di;
char a;
char z[3];

if((di=fopen("input.txt","r"))==NULL)
{
printf("Error\n");
return -1;
}
else
{
for(int i=0;i<8;i++)
{
a=fgetc(di);
for(int j=0;j<3;j++)
{
if(a!='\0' && a!='\n')
{
z[j]=a;
a=fgetc(di);
}
}
(s[i]=atoi(z));
}
}

return 0;
}


golgepapaz
14/05/2007, 01:05
sorun var ama sorunu bulamiyorsun? Nasil oluyor peki yani yan etki olarak ne oluyor, array dolmuyor mu? yarisi mi doluyor? dosyayi hic mi okumuyor?biraz daha aciklayici olursan biz de daha yardimsever oluruz... :)
Bu arada kodda bir sIkIntI goremiyorum....Eger dosyan dogru formattaysa yani
15CRLF
56CRLF
....
seklinde gidiyorsa yazdigin kod calisir....

kejya
14/05/2007, 01:13
#include<stdio.h>
#include<stdlib.h>
int s[20]={0};
int main()
{
FILE *di;
char a;
char z[3];

if((di=fopen("input.txt","r"))==NULL)
{
printf("Error\n");
return -1;
}
else
{
for(int i=0;i<20;i++)
{
a=fgetc(di);
for(int j=0;j<3;j++)
{
if(a!='\0' && a!='\n')
{
z[j]=a;
a=fgetc(di);
}
}
(s[i]=atoi(z));
}
}

for(int w=0;w<20;w++)
printf("%d\n",s[w]);
return 0;
}


diyelim ki kod yukarıdaki gibi aşağıda da benim inputlarım var.
array i başlangıçta düzgün doldurmaya başlıyor.
ama 18. elemanının değerini 19 da yazıyor(ilk olarak burada hatayla karşılaşıyorum)
ve sonra düzgün okumaya devam ediyor diyorum ki birkaç yerde daha bölgesel hatalar var


089
102
100
105
103
006
003
005
004
005
006
001
000
003
004
001
000
002
004
002

golgepapaz
14/05/2007, 01:17
089
102
100
105
103
006
003
005
004
005
006
001
000
003
004
001
000
002
004
002

input setin bu mu?

kejya
14/05/2007, 01:20
başlangış kısmı bu
17 nin verisini 18 e de yazıyor.
sonra düzgün çalışmaya devam ediyor
ara ara yine aynısı yapmış

quasimodo
14/05/2007, 01:23
fscanf() i kullansan

golgepapaz
14/05/2007, 01:26
hayir bu settede bir sorun yok? 17 dedigin hangi deger? 0 dan mi basliyorsun saymaya?

golgepapaz
14/05/2007, 01:28
if(a!='\0' && a!='\n')

&& yerine || yapsan ?

bence yapmasin :)

quasimodo
14/05/2007, 01:29
bence yapmasin :)


bencede :)

kejya
14/05/2007, 01:34
089
102
100
105
103
006
003
005
004
005
006
001
000
003
004
001
000
002
004
002

bu benim inputum ise

acaba doğru mu okumuş giye printf ile kontrol ediyorum
for(int w=0;w<20;w++)
printf("s[%d]=%d\n",w,s[w]);

sonuç

S[0]=89
s[1]=102
s[2]=100
s[3]=105
s[4]=103
s[5]=6
s[6]=3
s[7]=5
s[8]=4
s[9]=5
s[10]=6
s[11]=1
s[12]=0
s[13]=3
s[14]=4
s[15]=1
s[16]=0
s[17]=2
s[18]=2
s[19]=4

üşenmedim yazdım:)
s[18]=4 ve s[19]=2 olmalı
şimdi aslında inputlar uzuyor dediğim gibi
s[20]=2 yapıyor ve doğru devam ediyor
ama yer yer aynı sorun var!

quasimodo
14/05/2007, 01:39
for(i = 0; i < 8; i++) {
a = fgetc(di);

for(j = 0; j < 3; j++){
if(a == '\0' || a == '\n' || a == '\r')
break;
z[j] = a;
a = fgetc(di);
}
s[i] = atoi(z);
}

golgepapaz
14/05/2007, 01:41
ok hem g++ ile hem visualC 8.0 la derleyip calistridim....

sonuc
s[0]=89
s[1]=102
s[2]=100
s[3]=105
s[4]=103
s[5]=6
s[6]=3
s[7]=5
s[8]=4
s[9]=5
s[10]=6
s[11]=1
s[12]=0
s[13]=3
s[14]=4
s[15]=1
s[16]=0
s[17]=2
s[18]=4
s[19]=2

kejya
14/05/2007, 01:45
for(i = 0; i < 8; i++) {
a = fgetc(di);

for(j = 0; j < 3; j++){
if(a == '\0' || a == '\n' || a == '\r')
break;
z[j] = a;
a = fgetc(di);
}
s[i] = atoi(z);
}
aynı hatayı veriyor

kejya
14/05/2007, 01:46
ok hem g++ ile hem visualC 8.0 la derleyip calistridim....

sonuc
s[0]=89
s[1]=102
s[2]=100
s[3]=105
s[4]=103
s[5]=6
s[6]=3
s[7]=5
s[8]=4
s[9]=5
s[10]=6
s[11]=1
s[12]=0
s[13]=3
s[14]=4
s[15]=1
s[16]=0
s[17]=2
s[18]=4
s[19]=2
visual studio 6.0 da çalışıyorum,
bende neden böyle bir hata olabilir

golgepapaz
14/05/2007, 01:50
for(i = 0; i < 8; i++) {
a = fgetc(di);

for(j = 0; j < 3; j++){
if(a == '\0' || a == '\n' || a == '\r')
break;
z[j] = a;
a = fgetc(di);
}
s[i] = atoi(z);
}


bunun diger koddan bir farki yokki, o eger okudugu karakter kontrol karakteri ise bloga girmiyor, sen kontrol karakter iise girip dongu yu kiriyorsun...

golgepapaz
14/05/2007, 01:56
visual studio 6.0 da çalışıyorum,
bende neden böyle bir hata olabilir

hic bir fikrim yok,debug etmeyi denesene kodu. yada kullandigin dosyayi h-sol-ter.@g-mail.com (tireleri cikart) a bir gonder, ben ondan supheleneyiorum dogrusu...

quasimodo
14/05/2007, 01:58
for(i = 0; i < 8; ++i)
fscanf(di, "%d", &s[i]);

golgepapaz
14/05/2007, 02:14
evet tahmin ettigim gibi gonderdigin dosyada hata var 18inci satirda ki 002 den sonra fazladan bir bosluk var... yani soyle gidiyor...
001CRLF
000CRLF
002 CRLF //2 den sonra bosluk var.....
004CRLF
002CRLF
CRLF
CRLF
CRLF

Eger dosyayi whitespaceleri gosteren bir programla acarsan sende farkedeceksin (mesela Notepad++). programi calistirinca senin aldigin outputu aldim...eminim diger sorunlarda ayni sebepten meydana geliyorlar...ayrica dosyanin sonunda da bir suru bos satir var(CRLF satir sonunu isaret eder)

kejya
14/05/2007, 02:23
evet tahmin ettigim gibi gonderdigin dosyada hata var 18inci satirda ki 002 den sonra fazladan bir bosluk var... yani soyle gidiyor...
001CRLF
000CRLF
002 CRLF //2 den sonra bosluk var.....
004CRLF
002CRLF
CRLF
CRLF
CRLF

Eger dosyayi whitespaceleri gosteren bir programla acarsan sende farkedeceksin (mesela Notepad++). programi calistirinca senin aldigin outputu aldim...eminim diger sorunlarda ayni sebepten meydana geliyorlar...ayrica dosyanin sonunda da bir suru bos satir var(CRLF satir sonunu isaret eder)
aynen öyleymiş.
teşekkürler

golgepapaz
14/05/2007, 02:26
aynen öyleymiş.
teşekkürler
bisiy digil :)