praegune kellaaeg 18.06.2025 21:07:01
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
alexb1kl
HV vaatleja
liitunud: 10.01.2013
|
13.04.2013 10:21:05
[C] faili lugemise probleem |
|
|
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 |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
14.04.2013 12:42:13
Re: Matrix |
|
|
alexb1kl kirjutas: |
Kas keegi oskab öelda miks ta faili välja ei loe? Vastus koos source code oleks tore
c:
|
#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) { 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])) { } else { scanf("%d", &fn); } system("pause"); return 0 }
|
|
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 ) ja küsimustega edasi tegeleda.
_________________ 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 |
|
 |
DoS
HV veteran

liitunud: 19.08.2002
|
15.04.2013 01:17:37
|
|
|
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 |
|
 |
|
lisa lemmikuks |
|
|
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.
|