#include <stdio.h> #include <string.h> struct henkilo{ char etunimi[20+1]; char sukunimi[20+1]; char puhelin[20+1]; }; int main(void) { struct henkilo hloTaulukko[50]; const char *tiedNimi = "luettelo.txt"; int i, tietoja; FILE *fp; if((fp = fopen(tiedNimi,"r")) == NULL) { printf("tiedoston %s avaaminen epäonnistui\n", tiedNimi); return 0; } fscanf(fp,"%d", &tietoja); { for(i=0;i<tietoja;i++){ fscanf(fp,"%s %s %s", hloTaulukko[i].etunimi, hloTaulukko[i].sukunimi, hloTaulukko[i].puhelin); } fclose(fp); printf("Anna etunimi:"); scanf("%s", hloTaulukko[tietoja].etunimi); printf("Anna sukunimi:"); scanf("%s", hloTaulukko[tietoja].sukunimi); tietoja = strcmp("%s", tiedNimi); if(strcmp ("%s", tiedNimi)==0) { printf("Etsimääsi henkilöä ei löytynyt luettelosta."); return 0; } else { if(strcmp ("%s", tiedNimi)!=0) { printf("Tiedot poistettu luettelosta.\n"); } }} return 0; }
Tuommoinen on koodini. Se saa herjaa luettelo.txt sisällöstä (ei poista kysyttyä henkilö tiedostosta).
Millä sen saa poistettua?
Ohjelman tarkoitus on siis kysyä nimi ja sitten hävittää tämä kokonaan tiedostosta.
Ekan fscanf:in jälkeen tulee {-sulku. Turha?
Nimen kysymiseen asti koodi näyttää ihan hyvältä. Mutta sitten tulee jotakin kummallista. Vertaat "%s"-tekstiä tiedoston nimeen. Jos tiedoston nimi on "%s", henkilöä ei muka löytynyt. Tämmöinen koodi ei tietenkään toimi, varsinkaan ilman varsinaista poistokoodia.
Minä tekisin ohjelman niin, että se ensin kysäisee poistettavaa nimeä. Sitten ohjelma lukee tiedostosta rivejä yksi kerrallaan ja tallentaa ne saman tien toiseen tiedostoon. Jos kuitenkin rivillä on poistettavan henkilön nimi, sitä ei kopioida uuteen tiedostoon. Näin erillistä taulukkoa ei tarvita. Lopuksi uusi tiedosto kopioidaan vanhan päälle.
Ylimääräisistä aaltosulkupareista ei liene haittaa jos ei hyötyäkään.
"Tuommoinen on koodini. Se saa herjaa luettelo.txt sisällöstä (ei poista kysyttyä henkilö tiedostosta). "
Niin mikä herjaa? Kääntäjä? Ei kääntäjällä pitäisi olla mitään tekemistä tiedoston kanssa.
Vai ohjelmako siitä valittaa? Ohjelma pitäisi ensin kääntää, jotta se voisi siitä valittaa. Ja tuota koodia tuollaisenaan ei voi kääntää juuri Meitsin esittämän syyn takia.
Linkku kirjoitti:
Vai ohjelmako siitä valittaa? Ohjelma pitäisi ensin kääntää, jotta se voisi siitä valittaa. Ja tuota koodia tuollaisenaan ei voi kääntää juuri Meitsin esittämän syyn takia.
Hyvinhän tuo kääntyy ilman pienintäkään varoitusta. Kyllä C-kielessä saa lisätä ylimääräisiä lohkoja minne haluaa. En kyllä ymmärrä mitä hyötyä siitä on tässä ohjelmassa, kun siinä ei määritellä uusia muuttujia eikä sitä käytetä edes sisennyksen apuna.
FooBat kirjoitti:
Linkku kirjoitti:
Vai ohjelmako siitä valittaa? Ohjelma pitäisi ensin kääntää, jotta se voisi siitä valittaa. Ja tuota koodia tuollaisenaan ei voi kääntää juuri Meitsin esittämän syyn takia.
Hyvinhän tuo kääntyy ilman pienintäkään varoitusta. Kyllä C-kielessä saa lisätä ylimääräisiä lohkoja minne haluaa. En kyllä ymmärrä mitä hyötyä siitä on tässä ohjelmassa, kun siinä ei määritellä uusia muuttujia eikä sitä käytetä edes sisennyksen apuna.
Niinjuuaivan se lohkohan suljetaan tuossa lopussa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.