Miért tűnik el a szöveg az első szó után, és miért nem működik a program, ha nincs szóköz?
Folytattam a tanulást, és jelenleg az állományok kezelésénél tartok, de megint hibáztam valamit, és nem tudok rájönni, hogy mit :(
A feladat úgy szólt, hogy írjak egy programot, ami bekér egy szöveges állomány nevét, majd a szöveget nagybetűssé írja át, és elmenti egy másik állományban, ami a beolvasott állomány neve + egy n betű néven lesz elmentve, majd írja ki az új állomány tartalmát.
Én így próbáltam megoldani: [link]
A hiba a következő:
Mint ahogy a kérdésben is leírtam, ha van a szövegben szóköz, az azutáni rész eltűnik. Ha nem rakok szóközt, a 35.-36. sorban levő calloc illetve malloc nem fut le, kilép a program.
Meg tudja nekem valami mondani, hogy mi a hiba?
A probléma az, hogy nem érted pontosan mit is csinál a malloc. De haladjunk sorban.
6. sor. A main így néz ki:
int main(int argc, const char *argv[]).
Ez majd akkor lesz érdekes ha paraméterezni is akarod a programodat. Ahogy látod (és írtad is) a main függvény visszatérési értéke int típusú, ami két dolgot jelent a te esetedben. Az első hogy a 50 és 64 sorban lévő " return;" hibás. INT tehát szám. 0-ás visszatérési érték jelenti, hogy a programod rendesen lefutott, > 0 pedig, hogy hiba történt. A második pedig, hogy MINDEN esetben kell visszatérési érték, tehát a program végéről hiányzik neked egy "return 0;".
Most hogy ezt megbeszéltünk haladjunk is tovább.
7-9 sor. Változókat szokás inicializálni (kezdőértékkel ellátni), KÜLÖNÖSKÉPPEN a pointereket. Miért? Azért mert ha véletlenül ezelőtt hivatkozol rá mielőtt tényleges értéket adsz neki nem biztos, hogy azon a ponton fog a programod crashelni. Lehet, hogy átírsz valamit a memóriában ami csak sokkal később és a te pointeredtől teljesen függetlenül fog jelentkezni mint anomália, és utána órákig debuggolhatsz hogy vajon mi is történt.
Tehát FILE *allomany = NULL, *tarol = NULL. Hasonlóan a többi változó is.
11 sor: "olvas = (char *) malloc(sizeof(char));"
Mit is csinálsz a malloc tulajdonképpen? Lefoglal X bájtot a memóriából, ahol X a malloc egyetlen paramétere.
Mit csinál a sizeof? Visszaadja valaminek a méretét természetesen :) Na de minek? Hát a char-nak. Mi a char? Egy CHARakter. Tehát te itt szépen lefoglaltál 1 karakternek elegendő területet.
13-14 sor: Ebbe az 1 karakter méretű változódba beolvasol 1 karaktert a standard inputról, ami majd a fileneved lesz. Biztos ami biztos kiszámolod a méretét is :)
Nem tudom te hogy vagy vele de én általában nem 1 karakteres fileneveket használok, már a DOS is tudta a 8+3-at de tekintsünk el most ilyen "hitvitáktól", legyen 1 karakter az a filenév :)
17. sor: Megnyitod az állományod, ez a copy&paste majdnem jó, kérdés mit csinál az a 't' az fopen 2. paraméterében? (foglalmam sincs, de tegyük fel hogy valami windowsos ínyencség)
Haladjunk mert lassan esteledik.
23.sor: Lefoglalod a szintén 1 karakter méretű területet a szöveg változódnak. Gondolom ez a változó lesz amit majd bufferként használsz. A mai gépekben már elég sok memória szokott lenni, nem kellene vele spórolni :) De persze lehet 1 karakterenként is másolni. Nézzük tovább, nem kötekedem inkább.
24. sor: fscanf(allomany, "%s", szoveg);
Itt már googlizni kellett, hogy tényleg jól emlékszem, de igen. Bemásolom neked is:
"The C library function int fscanf(FILE *stream, const char *format, ...) reads formatted input from a stream."
Az angolul kevésbbé értők számára: Az fscanf függvény egy streamről olvas FORMÁZOTT inputot.
Link: [link]
A végén van példa is. Tehát mire jó a fscanf?
Mondjuk a fileod soraiban nevek vannak:
pl.: "Példa Béla"
(Gipsz urat nem szeretjük!)
Akkor be tudod úgy olvasni, hogy külön változóba a vezeték, és külön változóba a keresz nevet:
pl.: fscanf("%s %s", vezetek_nev, kereszt_nev)
Mivel te ilyet nem akarsz így nem a fscanf függvény kellene használni.
Van helyette fread, elvetemültebbeknek sima read.
link: [link]
Rájönni, hogy hogy kell használni házi feladat.
26 sor: Ez a sor jó lehet. De utána kellene nézni mi az strupr() visszatérési értéke. Ha nem void akkor jó lenne kezdeni vele valamit...esetleg. Szintén házi feladat. (főleg mert soha nem használtam ezt a függvényt és googlehoz már késő van, szerverfarm is aluszik...)
28-29 sor: Izé...mi a... Milyen fordítót használsz te? Vagy nem C-ben programozunk? Mert ha igen akkor változókat a függvény elején kell deklarálni még az első utasítás előtt. Legalábbis mi mindig így csináltuk. Meg különben is. Sok szerencsét egy hosszabb kódban kisilabizálni hogyan is került oda az a "kar".
Na de nézzük ezt a ciklust mert vannak itt még sokkal nagyobb csudák. Deklarálsz 2db int változót. Pontosabban egy int-et és egy int*-ot (). Aztán az int*-ot hasonlítod össze egy karakterrel...izé...szerintem te is érzed, hogy ez így nem kóser. Majd eggyel növeled a "masol" masol értékét. Aztán....(dobpergés)
kar = olvas[masol];
Fogod a szerencsétlen egy karakteredet és értékül adod az intednek. Vagyis adnád. Mivel "masol" itt már 1 és ha jól emlékszem "olvas" csak 1 lett több helyett ez a sor barátok közt is egy segfault aka crash aka " kilép a program".
És szerintem akkor itt álljunk is meg. Mi lenne ha 2 részre osztanád a feladatot. Legyen az első mondjuk az, hogy fileból olvasás, képernyőre kiírás (google: printf).
Ha az már megy, akkor majd hozzákezdhetsz az íráshoz.
Amit még javaslok neked, hogy ne copy&paste módszerrel programozz hanem próbáld megérteni melyik utasítás pontosan mit is csinál, milyen paramétereket vár, mi a visszatérési értéke. Jó szórakozást, és sok szerencsét!
EOF
Nem tudom, nálad a malloc() miért csak egy karakter, nálam akár 100-at is beolvas.
Én a közetkezőből tanulom a programozást: [link]
Ebből azt tanultam, hogy a calloc()-al meghatározom, hogy mennyi elemet, és mekkora méretben foglalok, a malloc()-ban pedig csak a méretet foglalom le, a mennyiséget nem. Ennek függvényében, mikor beírtam, hogy az állományom neve "szoveg.txt", akkor létrehozott egy szovegn.txt-t, és a mondatom első szavát el is tárolta benne.
Ahogy olvastam a választ, azt hittem, hogy nem a C-re gondolsz (elvégre elfelejtettem beleírni a kérdésembe), de aztán láttam, mégis egyre gondolunk. Így viszont nem értem, hogy miért nem érted a fopen()-ben azt a második betűt.
"Mindegyik mód jellemző kiegészíthető egy + paraméterrel, ez miden esetben azt jelenti, hogy az állományt olvashatjuk és írhatjuk is. A mód sztringben szoktuk még megadni, hogy milyen
állománnyal dolgozunk. t szöveges, b bináris állományt jelent."
Ezért írtam "rt"-t, mert a tanultak alapján így egy szöveges állományt fog beolvasni.
Azért nem akartam fread-et alkalmazni, mert ott meg kell adni, hogy mennyi karaktert olvasson be, de egy ismeretlen állomány esetében nem tudom, hogy mennyit lehet beolvasni. A pdf szerint az fscanf() hasonló a scanf()-hez, csak fájloknál használjuk. Igaz, a scanf szem képes szóközt beolvasni, azt már a következő scanf-be adja. Ez megmagyarázza a dolgot, hogy miért nem olvassa be a teljes szöveget, de még mindig nem értem, hogy miért jelentkezik hiba, ha nincs szóköz.
Csak most látom, hogy rossz helyen tettem fel a kérdésem :S
A Programozásban akartam, nem a programban. Ezért mindenkitől elnézést kérek...
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!