Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  [C] faili lugemise probleem märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
alexb1kl
HV vaatleja

liitunud: 10.01.2013




sõnum 13.04.2013 10:21:05 [C] faili lugemise probleem vasta tsitaadiga

Kas keegi oskab öelda miks ta faili välja ei loe? Vastus koos source code oleks tore
#include <stdio.h>
#include <math.h>
main()

{
FILE *f;
char ruut[8];
char fn;
printf("palun sisestage failinimi\n");
scanf("%d", &fn);
char fullname[256];
sprintf(fullname, "%s.txt",fn);
f = fopen (fullname,"r");
if (f == NULL)

{

printf("Vale nimi\n");
getchar();
}
else
fscanf(f,"%d %d %d %d %d %d %d %d %d",&ruut[0],&ruut[1],&ruut[2],&ruut[3],&ruut[4],&ruut[5],&ruut[6],&ruut[7],&ruut[8]);

if ((ruut[0]+ruut[1]+ruut[2]) == (ruut[3]+ruut[4]+ruut[5]) == (ruut[6]+ruut[7]+ruut[8]))
{
printf("true");
}
else
{
printf("false");
scanf("%d", &fn);

}
system("pause");
return 0
}
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 14.04.2013 12:42:13 Re: Matrix vasta tsitaadiga

alexb1kl kirjutas:
Kas keegi oskab öelda miks ta faili välja ei loe? Vastus koos source code oleks tore
c:
  1. #include <stdio.h>
  2. #include <math.h>
  3.  main()
  4.  
  5. {
  6.        FILE *f;
  7.        char ruut[8];
  8.        char fn;
  9.        printf("palun sisestage failinimi\n");
  10.        scanf("%d", &fn);
  11.        char fullname[256];
  12.         sprintf(fullname, "%s.txt",fn);
  13.        f = fopen (fullname,"r");
  14.        if (f == NULL)
  15.  
  16. {
  17.    
  18.     printf("Vale nimi\n");
  19.     getchar();
  20. }
  21. else
  22.             fscanf(f,"%d %d %d %d %d %d %d %d %d",&ruut[0],&ruut[1],&ruut[2],&ruut[3],&ruut[4],&ruut[5],&ruut[6],&ruut[7],&ruut[8]);
  23.  
  24.        if ((ruut[0]+ruut[1]+ruut[2]) == (ruut[3]+ruut[4]+ruut[5]) == (ruut[6]+ruut[7]+ruut[8]))
  25.       {
  26.        printf("true");
  27.        }
  28.        else
  29.       {
  30.        printf("false");
  31.        scanf("%d", &fn);
  32.        
  33.        }
  34.        system("pause");
  35.        return 0
  36.        }
Esiteks paar organisatoorset märkust. Palun ära postita oma küsimusi teinekord vanade ammu unustatud teemade lõppu, eriti kui sa selleks oma viimase postituse seal ära muudad.. Uus probleem - uus teema. Tõstsin praegu su postituse eraldi teemasse. Teiseks kasuta suurte koodilõikude postitamisel syntax või äärmisel juhul code tage. Panin praegu sinu tsiteeritud postituses syntax tagi ümber, et ilusam oleks.

Nüüd sisulise poole pealt. Ma pole küll suurem asi C asjatundja, aga hoobilt torkasid mõned asjad ikka silma.

1) Rida 8 defineerid muutuja char fn. Real 10 üritad sinna muutujasse lugeda sisse failinime. Minu parima teadmise kohaselt on char tüüpi muutuja C puhul üksik tähemärk. Selleks, et sinna lugeda failinime (mis eeldatavasti on pikem kui üks sümbol) peaksid defineerima sinna mõistlikku pikkusega char massiivi, nt char fn[256].

2) Real 7 defineerid muutuja char ruut[8] ehk tähemassiivi pikkusega 8 elementi. Ridadel 22 ja 24 üritad aga sellest massiivist kasutada üheksat elementi indeksitega 0 kuni 8. Ehk siis masiivis pikkusega n on võimalik kasutada indekseid 0 kuni n-1, sinul on aga ka n kasutuses, seega peaks see massiiv olema ruut[9], mitte [8].

3) Sisulise poole pealt - real 22 üritad eelpool nimetatud massiivi sisse lugeda failist numbreid. Taaskord tekib küsimus, et kas kõik numbrid ongi ühekohalised või võivad nad ka pikemad olla. Sinu defineeritud massiiv ruut hetkel on võimeline vastu võtma 8 üksikut tähemärki, mitte 8 erinevat suvalise pikkusega numbrit.

4) Kas neid numbreid ei oleks mõistlikum mingis int vms. numbrilises muutujatüübis hoida. Real 24 üritad nendega aritmeetilisi tehteid teha. char muutujatega aritmeetika tegemisel vist opereeritakse nende ASCII koodidega - see vist pole ju see, mida soovid?

5) loogika tehe kujul (a == b == c) ilmselt küll kompileerub C-s edukalt, aga ma küll kindel ei oleks, et see teeb seda, mida soovid. Pigem tehakse a == b võrdlus ära, saadakse tulemuseks true või false ning hakatakse seda võrdlema c väärtusega, mis sul ilmselt peaks olema mingi number. See ju kindlasti ei ole õige? Kindlam oleks selle saavutamiseks kirja panna (a == b && b == c) ehk siis maakeeli kontrollid, et a on võrdne b ning b on võrdne c, sellest automaatselt järeldub ju, et ka a on võrdne c ehk kõik kolm on võrdsed.

Alustuseks soovitaks need asjad üle vaadata, uuesti proovida ning konkreetsete veateadete (kuigi, C puhul see vist on tühi lootus, et veateated informatiivsed oleks icon_razz.gif) ja küsimustega edasi tegeleda. icon_smile.gif

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
DoS
HV veteran
DoS

liitunud: 19.08.2002




sõnum 15.04.2013 01:17:37 vasta tsitaadiga

Mõned parandused Fukiku vastusele
"char" ei tähenda (üksikut) tähemärki, vaid 8-bitist arvu ja näiteks gcc puhul on see märgiga, st arv -128st 127ni. Standardi järgi võib "char" aga ka märgita olla.
Kuna ASCIIs on tähemärgid 7-bitised, siis mahub see täpselt chari sisse, kusjuures ei ole vahet, kas see on märgiga või mitte ja tänu sellele hoitaksegi tähti enamjaolt char tüüpi massiivis. Iseenesest ei ole muidugi probleem teksti ka int/float/double vms muutujas või massiivis hoida, see teeb lihtsalt edasised toimingud keerulisemaks ja tänu sellele praktikas eriti ei rakendata.

Ehk siis kokkuvõtvalt muud kommentaarid on enam-vähem täpsed, aga 3) puhul sõltub numbritest, mida failist lugeda. Kui need jäävad alla 128, probleeme veel ei teki. Küll aga caritseb real 24 oht, et liitmisel tekib overflow. Kui näiteks ruut[0]==127, ruut[1]==1 ja ruut[2] == 1, siis on liitmise tulemuseks -127 (või 129, kui char on märgita).
Kommentaarid: 50 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 47
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  [C] faili lugemise probleem
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.