Tietojen poistaminen tiedostosta...jatkuu

Tehtävä on siis seuraavanlainen: Puhelinluettelo - henkilön tietojen poistaminen.

Tee ohjelma, jolla voidaan poistaa luettelosta tietyn henkilön tiedot. Ohjelma kysyy ensin etunimen ja tämän jälkeen sukunimen. Ohjelma tarkistaa, löytyykö henkilön tiedot. Mikäli henkilö löytyy luettelosta, tiedot poistetaan. Muuten tulostetaan virheilmoitus "Etsimääsi henkilöä ei löytynyt luettelosta.".

Vihje:
Ennen kuin ryhdyt laatimaan varsinaista koodia, sinun kannattaa suunnitella ohjelma hyvin. Rakenteiden käyttäminen voi helpottaa tehtävää. Päivitetyn listan tallentaminen mitä ilmeisimmin tuhoaa aikaisemmat tiedot tiedostosta luettelo.txt.

Nimitietojen vertailu onnistuu c-kielen funktiolla strcmp(), joka löytyy kirjastotiedostosta string.h. Voit tutustua funktion käyttöön c-manuaalissa.


Esimerkkitulostus

Anna etunimi:Timo
Anna sukunimi:Timpuri
Tiedot poistettu luettelosta.
----------------------------------------------
Olen päässyt koodissa kyselyyn ja tietojen päivittämiseen saakka. Kuinka tuo koodi pitää kirjoittaa, että siitä saisi poistettua haluamat tiedot? Minulla ei ole harmainta hajua, kuinka tuosta voi poistaa tietoja :( Koodini on alla:

#include
#include


/* tehdään rakenteesta globaali */
struct henkilo{
char etunimi[20 1];
char sukunimi[20 1];
};

int main(void)
{
struct henkilo hloTaulukko[50];
const char *tiedNimi = "luettelo.txt";
int i, tietoja;
FILE *fp;

/* haetaan tiedostosta vanhat tiedot */
if((fp = fopen(tiedNimi,"r")) == NULL){
printf("tiedoston %s avaaminen epäonnistui\n", tiedNimi);
exit(1);
}
fscanf(fp,"%d", &tietoja);
for(i=0;i
244259
Äänestä

Muut lukivat myös

Vastaukset 24

Vanhimmat

että vanha tiedosto luetaan kokonaisuudessaan
muistiin PAITSI etsityn henkilön tiedot.
Sitten kirjoitetaan kaikki takaisin kunhan ensin
on tuhottu vanha tiedosto.
Uudesta tiedostosta siten puuttuu poistettavan
henkilön tiedot.
Silleen se menee.

Äänestä

Ilmoittaa tarkastusohjelma silti, että koodissa on virheitä.

Uskon kyllä, että tuo ohjelma pitää tehdä jotenkin helpommalla tavalla..

Äänestä
  • Siinä meikäläisen versiossa on kaikki tähänastiset vaiheet eli niitä funktioita UusiHenkilo ja TulostaSisalto et tuohon kysymykseen tarvitse. Sen sijaan ennen PoistaHenkilo -kutsua pitäisi suorittaa tietojen vertailu sillä strncmp:lla, jotta tietäisi monettako oltaisiin poistamassa. Voit siis poistaa siitä main:sta sen koko while -silmukan ja kutsua suoraan sitä PoistaHenkilo -funktiota kunhan ensin tiedät mitä olet poistamassa.

    Äänestä

  • tähänastiset kirjoitti:

    Siinä meikäläisen versiossa on kaikki tähänastiset vaiheet eli niitä funktioita UusiHenkilo ja TulostaSisalto et tuohon kysymykseen tarvitse. Sen sijaan ennen PoistaHenkilo -kutsua pitäisi suorittaa tietojen vertailu sillä strncmp:lla, jotta tietäisi monettako oltaisiin poistamassa. Voit siis poistaa siitä main:sta sen koko while -silmukan ja kutsua suoraan sitä PoistaHenkilo -funktiota kunhan ensin tiedät mitä olet poistamassa.

    Meillä ei ole käyty mitään näihin tehtäviin liittyviä esimerkkejäkään tunnilla ja ei ole harmainta hajua kuin tuo tehdään?

    Kuinka tuo sitten koodiin kirjoitetaan? Olen jo yrittänyt sitä vertailufunktiota sinne laittaa, mutta en vain osaa sitä käyttää...

    Äänestä

  • Koodari kirjoitti:

    Meillä ei ole käyty mitään näihin tehtäviin liittyviä esimerkkejäkään tunnilla ja ei ole harmainta hajua kuin tuo tehdään?

    Kuinka tuo sitten koodiin kirjoitetaan? Olen jo yrittänyt sitä vertailufunktiota sinne laittaa, mutta en vain osaa sitä käyttää...

    struct henkilo etsittavahlo;
    printf("Anna etunimi:");
    scanf("%s", etsittavahlo.enimi);
    printf("Anna sukunimi:");
    scanf("%s", etsittavahlo.snimi);

    for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk++, ++i){
       if(strcmp(phenk->enimi, etsittavahlo.enimi)){
          if(strcmp(phenk->snimi, etsittavahlo.snimi)){
             PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i + 1);
             printf("Tiedot poistettu luettelosta.");
             j = 1;
             break;
          }
       }
    }
    if(!j)
       printf("Etsimääsi henkilöä ei löytynyt luettelosta.");

    Äänestä

  • pääsee alkuun kirjoitti:

    struct henkilo etsittavahlo;
    printf("Anna etunimi:");
    scanf("%s", etsittavahlo.enimi);
    printf("Anna sukunimi:");
    scanf("%s", etsittavahlo.snimi);

    for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk++, ++i){
       if(strcmp(phenk->enimi, etsittavahlo.enimi)){
          if(strcmp(phenk->snimi, etsittavahlo.snimi)){
             PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i + 1);
             printf("Tiedot poistettu luettelosta.");
             j = 1;
             break;
          }
       }
    }
    if(!j)
       printf("Etsimääsi henkilöä ei löytynyt luettelosta.");

    En vaan osaa vieläkään tuota. Kuinka tuon koodin pätkän upotat tuohon varsinaiseen ohjelmaan? Ollaan vain yhtä tiedostoa kerrallaan aina tehty :(

    Alkaa olemaan kohta aika epätoivoinen olo :(

    Äänestä

  • Koodari kirjoitti:

    En vaan osaa vieläkään tuota. Kuinka tuon koodin pätkän upotat tuohon varsinaiseen ohjelmaan? Ollaan vain yhtä tiedostoa kerrallaan aina tehty :(

    Alkaa olemaan kohta aika epätoivoinen olo :(

    #include
    #include
    #include

    struct henkilo {
       char enimi[21];
       char snimi[21];
       char puh[21];
    };

    const char rekisteri[] = "luettelo.txt";

    char* TiedonKopiointi(char*out, char*in, unsigned koko)
    {
       char* pc, *pc2;
       unsigned j;
       memset(out, 0, koko);
       pc = in;
       pc2 = out;
       for(j = koko; j && *pc != ' ' && *pc != '\n'; --j){
          *pc2 = *pc;
          pc2++;
          pc++;
       }
       return ++pc;
    }

    struct henkilo* TaytaTietue(char*buffer, struct henkilo*phenk)
    {
       char* pc;
       pc = buffer;
       pc = TiedonKopiointi(phenk->enimi, pc, 21);
       pc = TiedonKopiointi(phenk->snimi, pc, 21);
       pc = TiedonKopiointi(phenk->puh, pc, 21);
       return ++phenk;
    }

    unsigned LueTiedostoMuistiin(struct henkilo*henkilo_lista)
    {
       char buffer[sizeof(henkilo)];
       FILE *tiedosto;
       int hlomaara = 0;
       struct henkilo* phenk;
       long i;
       if ((tiedosto = fopen(rekisteri, "r")) != NULL) {
          fgets(buffer, 4, tiedosto);
          hlomaara = atoi(buffer);
          if (hlomaara >= 50) {
             printf("Korkeintaan %d tietuetta", 50);
             fclose(tiedosto);
             return -1;
          }
          for(i = 1, phenk = henkilo_lista; i i)
          return phenk;
       else if(poistettava != i){ /*Viimeistä poistetaan*/
          phenk1 = henkilo_lista;
          phenk1 += (poistettava - 1); /*Poistettavan kohdalle*/
          phenk2 = phenk1;
          phenk2++; /*Ensimmäisen siirrettävän kohdalle*/
          /*Siirretään loppuja pykälällä*/
          pc2 = (char*)(void*)phenk2;
          pc = (char*)(void*)phenk;
          memcpy(phenk1, phenk2, pc - pc2);
       }
       *hlomaara = i - 1;
       return --phenk;
    }

    unsigned TallennaTiedostoon(struct henkilo* phenk, unsigned maara)
    {
       FILE *tiedosto;
       unsigned i;
       if ((tiedosto = fopen(rekisteri, "w")) == NULL) { /*Uuden tiedoston luonti*/
          printf("Virhe tiedoston avaamisessa.");
          return 1;
       }
       fprintf(tiedosto, "%d\n", maara); /*Kirjoitettavien määrä tiedoston alkuun*/
       for(i = maara; i; --i){
          fprintf(tiedosto,"%s %s %s\n", phenk->enimi, phenk->snimi, phenk->puh);
          phenk++;
       }
       fclose(tiedosto);
       printf("Tietojen tallennus onnistui\n");
       return 0;
    }

    int main(void)
    {
       struct henkilo henkilo_lista[50];
       unsigned hlomaara, poistettava;
       struct henkilo* phenk;
       unsigned i, j;
       struct henkilo etsittavahlo;
       
       hlomaara = LueTiedostoMuistiin(henkilo_lista);
       if(hlomaara > (unsigned)-1)
          return 1;

       printf("Anna etunimi:");
       scanf("%s", etsittavahlo.enimi);
       printf("Anna sukunimi:");
       scanf("%s", etsittavahlo.snimi);

       for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk++, ++i){
           if(strcmp(phenk->enimi, etsittavahlo.enimi)){
                if(strcmp(phenk->snimi, etsittavahlo.snimi)){
                    PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i + 1);
                    printf("Tiedot poistettu luettelosta.");
                    j = 1;
                    break;
                }
           }
       }
       if(!j)
           printf("Etsimääsi henkilöä ei löytynyt luettelosta.");    

       /*Tallennetaan lista tiedostoon*/
       TallennaTiedostoon(henkilo_lista, hlomaara);

       return 0;
    }

    Äänestä

  • kokonaisuudessaan kirjoitti:

    #include
    #include
    #include

    struct henkilo {
       char enimi[21];
       char snimi[21];
       char puh[21];
    };

    const char rekisteri[] = "luettelo.txt";

    char* TiedonKopiointi(char*out, char*in, unsigned koko)
    {
       char* pc, *pc2;
       unsigned j;
       memset(out, 0, koko);
       pc = in;
       pc2 = out;
       for(j = koko; j && *pc != ' ' && *pc != '\n'; --j){
          *pc2 = *pc;
          pc2++;
          pc++;
       }
       return ++pc;
    }

    struct henkilo* TaytaTietue(char*buffer, struct henkilo*phenk)
    {
       char* pc;
       pc = buffer;
       pc = TiedonKopiointi(phenk->enimi, pc, 21);
       pc = TiedonKopiointi(phenk->snimi, pc, 21);
       pc = TiedonKopiointi(phenk->puh, pc, 21);
       return ++phenk;
    }

    unsigned LueTiedostoMuistiin(struct henkilo*henkilo_lista)
    {
       char buffer[sizeof(henkilo)];
       FILE *tiedosto;
       int hlomaara = 0;
       struct henkilo* phenk;
       long i;
       if ((tiedosto = fopen(rekisteri, "r")) != NULL) {
          fgets(buffer, 4, tiedosto);
          hlomaara = atoi(buffer);
          if (hlomaara >= 50) {
             printf("Korkeintaan %d tietuetta", 50);
             fclose(tiedosto);
             return -1;
          }
          for(i = 1, phenk = henkilo_lista; i i)
          return phenk;
       else if(poistettava != i){ /*Viimeistä poistetaan*/
          phenk1 = henkilo_lista;
          phenk1 += (poistettava - 1); /*Poistettavan kohdalle*/
          phenk2 = phenk1;
          phenk2++; /*Ensimmäisen siirrettävän kohdalle*/
          /*Siirretään loppuja pykälällä*/
          pc2 = (char*)(void*)phenk2;
          pc = (char*)(void*)phenk;
          memcpy(phenk1, phenk2, pc - pc2);
       }
       *hlomaara = i - 1;
       return --phenk;
    }

    unsigned TallennaTiedostoon(struct henkilo* phenk, unsigned maara)
    {
       FILE *tiedosto;
       unsigned i;
       if ((tiedosto = fopen(rekisteri, "w")) == NULL) { /*Uuden tiedoston luonti*/
          printf("Virhe tiedoston avaamisessa.");
          return 1;
       }
       fprintf(tiedosto, "%d\n", maara); /*Kirjoitettavien määrä tiedoston alkuun*/
       for(i = maara; i; --i){
          fprintf(tiedosto,"%s %s %s\n", phenk->enimi, phenk->snimi, phenk->puh);
          phenk++;
       }
       fclose(tiedosto);
       printf("Tietojen tallennus onnistui\n");
       return 0;
    }

    int main(void)
    {
       struct henkilo henkilo_lista[50];
       unsigned hlomaara, poistettava;
       struct henkilo* phenk;
       unsigned i, j;
       struct henkilo etsittavahlo;
       
       hlomaara = LueTiedostoMuistiin(henkilo_lista);
       if(hlomaara > (unsigned)-1)
          return 1;

       printf("Anna etunimi:");
       scanf("%s", etsittavahlo.enimi);
       printf("Anna sukunimi:");
       scanf("%s", etsittavahlo.snimi);

       for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk++, ++i){
           if(strcmp(phenk->enimi, etsittavahlo.enimi)){
                if(strcmp(phenk->snimi, etsittavahlo.snimi)){
                    PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i + 1);
                    printf("Tiedot poistettu luettelosta.");
                    j = 1;
                    break;
                }
           }
       }
       if(!j)
           printf("Etsimääsi henkilöä ei löytynyt luettelosta.");    

       /*Tallennetaan lista tiedostoon*/
       TallennaTiedostoon(henkilo_lista, hlomaara);

       return 0;
    }

    Ei valitettavasti toimi :(
    Heittää herjaa mm. char buffer[sizeof(henkilo)];

    ja kaikista kohdista joissa on "buffer" tai "atoi".

    Äänestä

  • Koodari kirjoitti:

    Ei valitettavasti toimi :(
    Heittää herjaa mm. char buffer[sizeof(henkilo)];

    ja kaikista kohdista joissa on "buffer" tai "atoi".

    Pitäis varmaankin olla
    char buffer[sizeof(struct henkilo)];

    Äänestä

  • vaiks tätä kirjoitti:

    Pitäis varmaankin olla
    char buffer[sizeof(struct henkilo)];

    if(fgets(buffer[sizeof(struct henkilo)], tiedosto) == NULL)

    Ilmoittaa, että tarkasta fgets-argumentin tietotyyppi.

    Äänestä

  • Koodari kirjoitti:

    if(fgets(buffer[sizeof(struct henkilo)], tiedosto) == NULL)

    Ilmoittaa, että tarkasta fgets-argumentin tietotyyppi.

    Tuo pitäisi olla:
    if(fgets(buffer, sizeof(struct henkilo), tiedosto) == NULL)

    Äänestä

  • tuohon herjaan kirjoitti:

    Tuo pitäisi olla:
    if(fgets(buffer, sizeof(struct henkilo), tiedosto) == NULL)

    henkilo *phenk1, *phenk2;

    Ei tunnista tuota henkilo-kohtaa muuttujaksi...

    Äänestä

  • Koodari kirjoitti:

    henkilo *phenk1, *phenk2;

    Ei tunnista tuota henkilo-kohtaa muuttujaksi...

    struct henkilo *phenk1, *phenk2;

    Äänestä

  • auttaa muutos kirjoitti:

    struct henkilo *phenk1, *phenk2;

    Eipä toimi vieläkään. Se jättää ainoastaan tuon poistettavan nimen (jota siis kysytään) tuohon kansioon ja tuhoaa kaiken muun tiedon...vaikka nimenomaan tuo nimi, jota kysytään pitäisi poistaa.

    Äänestä

  • Koodari kirjoitti:

    Eipä toimi vieläkään. Se jättää ainoastaan tuon poistettavan nimen (jota siis kysytään) tuohon kansioon ja tuhoaa kaiken muun tiedon...vaikka nimenomaan tuo nimi, jota kysytään pitäisi poistaa.

    Tässä kaksi osaa uudestaan. Molemmissa oli virhe

    struct henkilo* PoistaHenkilo(struct henkilo* henkilo_lista, struct henkilo*phenk,
                                                 unsigned* hlomaara, unsigned poistettava)
    {
    .
    :
          /*Siirretään loppuja pykälällä*/
          pc = (char*)(void*)phenk2; /* TÄSSÄ OLI VIRHE */
          pc2 = (char*)(void*)phenk; /* TÄSSÄ OLI VIRHE */
          memcpy(phenk1, phenk2, pc - pc2);
    .
    :
    }

    int main(void)
    {
    .
    :

       for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk , i){
           if(strcmp(phenk->enimi, etsittavahlo.enimi) == 0) { /* TÄSSÄ OLI VIRHE */
                if(strcmp(phenk->snimi, etsittavahlo.snimi) == 0) { /* TÄSSÄ OLI VIRHE */
                    PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i 1);
                    printf("Tiedot poistettu luettelosta.");
                    j = 1;
                    break;
                }
           }
       }
    .
    :
    }

    Äänestä

  • löytyi funktioista kirjoitti:

    Tässä kaksi osaa uudestaan. Molemmissa oli virhe

    struct henkilo* PoistaHenkilo(struct henkilo* henkilo_lista, struct henkilo*phenk,
                                                 unsigned* hlomaara, unsigned poistettava)
    {
    .
    :
          /*Siirretään loppuja pykälällä*/
          pc = (char*)(void*)phenk2; /* TÄSSÄ OLI VIRHE */
          pc2 = (char*)(void*)phenk; /* TÄSSÄ OLI VIRHE */
          memcpy(phenk1, phenk2, pc - pc2);
    .
    :
    }

    int main(void)
    {
    .
    :

       for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk , i){
           if(strcmp(phenk->enimi, etsittavahlo.enimi) == 0) { /* TÄSSÄ OLI VIRHE */
                if(strcmp(phenk->snimi, etsittavahlo.snimi) == 0) { /* TÄSSÄ OLI VIRHE */
                    PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i 1);
                    printf("Tiedot poistettu luettelosta.");
                    j = 1;
                    break;
                }
           }
       }
    .
    :
    }

    int main(void)
    {
       struct henkilo henkilo_lista[MAX_HENKILOA];
       unsigned hlomaara, poistettava;
       struct henkilo* phenk;
       unsigned i, j;
       struct henkilo etsittavahlo;
       
       hlomaara = LueTiedostoMuistiin(henkilo_lista);
       if(hlomaara > (unsigned)-1)
          return 1;

       printf("Anna etunimi:");
       scanf("%s", etsittavahlo.enimi);
       printf("Anna sukunimi:");
       scanf("%s", etsittavahlo.snimi);

       for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk++, ++i){
           if(!strcmp(phenk->enimi, etsittavahlo.enimi)) {
                if(!strcmp(phenk->snimi, etsittavahlo.snimi)) {
                   phenk = henkilo_lista;
                   phenk += hlomaara; /*Uuden tiedon kohdalle*/
                   PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i + 1);
                   printf("Tiedot poistettu luettelosta.");
                   j = 1;
                   break;
                }
           }
       }
       if(!j)
           printf("Etsimääsi henkilöä ei löytynyt luettelosta.");
       /*Tallennetaan lista tiedostoon*/
       TallennaTiedostoon(henkilo_lista, hlomaara);

       return 0;
    }

    Äänestä

  • löytyi funktioista kirjoitti:

    Tässä kaksi osaa uudestaan. Molemmissa oli virhe

    struct henkilo* PoistaHenkilo(struct henkilo* henkilo_lista, struct henkilo*phenk,
                                                 unsigned* hlomaara, unsigned poistettava)
    {
    .
    :
          /*Siirretään loppuja pykälällä*/
          pc = (char*)(void*)phenk2; /* TÄSSÄ OLI VIRHE */
          pc2 = (char*)(void*)phenk; /* TÄSSÄ OLI VIRHE */
          memcpy(phenk1, phenk2, pc - pc2);
    .
    :
    }

    int main(void)
    {
    .
    :

       for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk , i){
           if(strcmp(phenk->enimi, etsittavahlo.enimi) == 0) { /* TÄSSÄ OLI VIRHE */
                if(strcmp(phenk->snimi, etsittavahlo.snimi) == 0) { /* TÄSSÄ OLI VIRHE */
                    PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i 1);
                    printf("Tiedot poistettu luettelosta.");
                    j = 1;
                    break;
                }
           }
       }
    .
    :
    }

    Laittaisitko koodin kokonaisuudessaan, niin selventäisi asiaa?

    Äänestä

  • funktio versiota n kirjoitti:

    int main(void)
    {
       struct henkilo henkilo_lista[MAX_HENKILOA];
       unsigned hlomaara, poistettava;
       struct henkilo* phenk;
       unsigned i, j;
       struct henkilo etsittavahlo;
       
       hlomaara = LueTiedostoMuistiin(henkilo_lista);
       if(hlomaara > (unsigned)-1)
          return 1;

       printf("Anna etunimi:");
       scanf("%s", etsittavahlo.enimi);
       printf("Anna sukunimi:");
       scanf("%s", etsittavahlo.snimi);

       for(i = 0, j = 0, phenk = henkilo_lista; i < hlomaara ; phenk++, ++i){
           if(!strcmp(phenk->enimi, etsittavahlo.enimi)) {
                if(!strcmp(phenk->snimi, etsittavahlo.snimi)) {
                   phenk = henkilo_lista;
                   phenk += hlomaara; /*Uuden tiedon kohdalle*/
                   PoistaHenkilo(henkilo_lista, phenk, &hlomaara, i + 1);
                   printf("Tiedot poistettu luettelosta.");
                   j = 1;
                   break;
                }
           }
       }
       if(!j)
           printf("Etsimääsi henkilöä ei löytynyt luettelosta.");
       /*Tallennetaan lista tiedostoon*/
       TallennaTiedostoon(henkilo_lista, hlomaara);

       return 0;
    }

    Nyt toimii hienosti :) Kiitos aivan älyttömän paljon avusta :)Kaljat sulle :)

    Äänestä

  • Koodari kirjoitti:

    Laittaisitko koodin kokonaisuudessaan, niin selventäisi asiaa?

    Ei tarvitsekaan laittaa, sillä sain ton toimimaan :)

    Äänestä

  • Koodari kirjoitti:

    Nyt toimii hienosti :) Kiitos aivan älyttömän paljon avusta :)Kaljat sulle :)

    On se mukavaa nähdä kun nyt kaikilla on asiat hyvin. Yksi pääsi pätemään ja toinen sai teetettyä tehtävänsä muilla oppimatta mistään mitään.

    Juuri näin!!!!

    Äänestä

  • hyvä hyvä!!! kirjoitti:

    On se mukavaa nähdä kun nyt kaikilla on asiat hyvin. Yksi pääsi pätemään ja toinen sai teetettyä tehtävänsä muilla oppimatta mistään mitään.

    Juuri näin!!!!

    " ... toinen sai teetettyä tehtävänsä muilla oppimatta mistään mitään."

    Selvää johtaja ainesta.

    Äänestä

  • hyvä hyvä!!! kirjoitti:

    On se mukavaa nähdä kun nyt kaikilla on asiat hyvin. Yksi pääsi pätemään ja toinen sai teetettyä tehtävänsä muilla oppimatta mistään mitään.

    Juuri näin!!!!

    >Yksi pääsi pätemään...

    Eipäs nyt noinkaan. Sain hyvää treeniä tuossa. Aika hyvä tehtävä vai mitä ?

    Äänestä

vaikka onkin jo erittäin vanha keskustelu niin bongasin sen kuitenikin kun olen itse tekemässa sama homma.

Onglema onkin se että tämä tulostaa:
3
Keijo Kojootti 050-3500980
Brian Kottarainen 040-3980982
Brian Kottarainen 040-3980982

Kun sen pitäisi tulostaa:

3
Keijo Kojootti 050-3500980
Brian Kottarainen 040-3980982
Brita Kottarainen 05-4567393

ongelma vissiin loopissa, mutta missä?

Äänestä

Kommentoi aloitusta


Koodari kirjoitti:

Tehtävä on siis seuraavanlainen: Puhelinluettelo - henkilön tietojen poistaminen.

Tee ohjelma, jolla voidaan poistaa luettelosta tietyn henkilön tiedot. Ohjelma kysyy ensin etunimen ja tämän jälkeen sukunimen. Ohjelma tarkistaa, löytyykö henkilön tiedot. Mikäli henkilö löytyy luettelosta, tiedot poistetaan. Muuten tulostetaan virheilmoitus "Etsimääsi henkilöä ei löytynyt luettelosta.".

Vihje:
Ennen kuin ryhdyt laatimaan varsinaista koodia, sinun kannattaa suunnitella ohjelma hyvin. Rakenteiden käyttäminen voi helpottaa tehtävää. Päivitetyn listan tallentaminen mitä ilmeisimmin tuhoaa aikaisemmat tiedot tiedostosta luettelo.txt.

Nimitietojen vertailu onnistuu c-kielen funktiolla strcmp(), joka löytyy kirjastotiedostosta string.h. Voit tutustua funktion käyttöön c-manuaalissa.


Esimerkkitulostus

Anna etunimi:Timo
Anna sukunimi:Timpuri
Tiedot poistettu luettelosta.
----------------------------------------------
Olen päässyt koodissa kyselyyn ja tietojen päivittämiseen saakka. Kuinka tuo koodi pitää kirjoittaa, että siitä saisi poistettua haluamat tiedot? Minulla ei ole harmainta hajua, kuinka tuosta voi poistaa tietoja :( Koodini on alla:

#include
#include


/* tehdään rakenteesta globaali */
struct henkilo{
char etunimi[20 1];
char sukunimi[20 1];
};

int main(void)
{
struct henkilo hloTaulukko[50];
const char *tiedNimi = "luettelo.txt";
int i, tietoja;
FILE *fp;

/* haetaan tiedostosta vanhat tiedot */
if((fp = fopen(tiedNimi,"r")) == NULL){
printf("tiedoston %s avaaminen epäonnistui\n", tiedNimi);
exit(1);
}
fscanf(fp,"%d", &tietoja);
for(i=0;i

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu