Sanakirja

Olen yrittänyt tehdä perus C:llä todella yksinkertaista sanakirjaohjelmaa, joka lukee sanat tekstitiedostosta.... tuloksetta.
Osaan kyllä lukea tiedostosta ohjelmaani, mutten millään keksi miten saisin listalta tulostettua sanan vastin parin eli kirjoitan sanan auto niin pitäisi tulostua bil. Tällä hetkellä tulostuu molemmat.

Eli jos jollakin olisi todella yksinkertainen esimerkki.
6557
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

Alla esimerkki C :lla (' rivin alussa korjaa
ton indentaation):

---------------------------------------------
#include
#include
#include
#include
#include

int main()
{
'   using namespace std;
'
'   typedef map Dictionary;
'   Dictionary dict;
'
'   ifstream in("file1.txt");
'
'   while (!in.eof()) {
'      string key, value;
'      in >> key >> value;
'      dict.insert(make_pair(key, value));
'   }
'
'   while (cin) {
'      string word;
'      cout

Äänestä
  • Niin kyllä tuo c++:lla onkin jopa minun tehtävissä, mutta perus c:llä ei näytä olevan.

    Alla on koodi runko jolla saan tiedoston sisällön tulostettua, mutten oikein keksi miten vertailtua.

    Alla oleva on siis tekemäni runko, jonka pohjalta yritän ongelmaa ratkaista. Ei tämä nyt elämää suurempaa ole vaikkein saisi tehtyäkään, mutta olen ähertänyt tämän kimpussa jo paripäivää :)

    [code]
    #include

    int main(void)
    {
    char nimi[30]; //tarkistetaan onko tiedostoa olemassa
    char seuraava[80]; //seuraava rivi tiedostosta
    int i;
    int pituus;
    FILE *auki;
    char sana[30];


    printf("Anna avattavan tiedoston nimi: \n");
    scanf("%s",&nimi);

    if((auki=fopen(nimi,"r"))==NULL)
    {
    printf("Annettua tiedostoa ei löydy\n");
    }

    else

    fgets(seuraava,80,auki);


    while (!feof(auki) )
    {
    ///katsotaan pituus
    pituus=strlen(seuraava);

    for(i=0; i < pituus; i++)
    {
    //jos tulee ";" niin tulostetaan space
    if(seuraava[i]==';')
    {
    printf("\t");
    }

    else
    printf("%c",seuraava[i]);
    }

    fgets(seuraava,80,auki);

    }

    }



    [/code]

    Äänestä

  • Laura kirjoitti:

    Niin kyllä tuo c++:lla onkin jopa minun tehtävissä, mutta perus c:llä ei näytä olevan.

    Alla on koodi runko jolla saan tiedoston sisällön tulostettua, mutten oikein keksi miten vertailtua.

    Alla oleva on siis tekemäni runko, jonka pohjalta yritän ongelmaa ratkaista. Ei tämä nyt elämää suurempaa ole vaikkein saisi tehtyäkään, mutta olen ähertänyt tämän kimpussa jo paripäivää :)

    [code]
    #include

    int main(void)
    {
    char nimi[30]; //tarkistetaan onko tiedostoa olemassa
    char seuraava[80]; //seuraava rivi tiedostosta
    int i;
    int pituus;
    FILE *auki;
    char sana[30];


    printf("Anna avattavan tiedoston nimi: \n");
    scanf("%s",&nimi);

    if((auki=fopen(nimi,"r"))==NULL)
    {
    printf("Annettua tiedostoa ei löydy\n");
    }

    else

    fgets(seuraava,80,auki);


    while (!feof(auki) )
    {
    ///katsotaan pituus
    pituus=strlen(seuraava);

    for(i=0; i < pituus; i++)
    {
    //jos tulee ";" niin tulostetaan space
    if(seuraava[i]==';')
    {
    printf("\t");
    }

    else
    printf("%c",seuraava[i]);
    }

    fgets(seuraava,80,auki);

    }

    }



    [/code]

    Alla olisi yksi ratkaisu. Jos on kyseessä kotitehtävä niin kannattaa kuitenkin miettiä miten toi toimii.

    Yleisesti, ellei ole pakko tehdä nimenomaan C:llä
    niin esim. C++-ratkaisu on siistimpi ja siis suositellumpi. Kaikkein paras toi olis tehdä awk:lla kun se on nimenomaan tommoseen käyttöön tehty :)

    --------------------------------------------

    #include
    #include
    #include
    #include

    struct DictionaryRec {
    '   char *key_;
    '   char *value_;
    };

    int main()
    {
    '   FILE *fp = NULL;
    '   /* Kovakoodattu */
    '   DictionaryRec dict[256];
    '   int i;
    '   int entries = 0;
    '   char buf[81];
    '
    '   fp = fopen("file1.txt", "r");
    '   while (!feof(fp) && entries < 256) {
    '      if (fgets(buf, 80, fp) != NULL) {
    '         char *pos = strchr(buf, '\t');
    '         if (pos != NULL && (pos + 1) != NULL) {
    '            pos++;

    '            size_t key_len = abs(pos - &buf[0]);
    '            dict[entries].key_ = (char *)malloc(key_len);
    '            memset(dict[entries].key_, 0, key_len);
    '            strncpy(dict[entries].key_, &buf[0], key_len - 1);

    '            size_t value_len = strlen(buf) - key_len;
    '            dict[entries].value_ = (char *)malloc(value_len);
    '            memset(dict[entries].value_, 0, value_len);
    '            strncpy(dict[entries].value_, pos, value_len - 1);

    '            entries++;
    '         }
    '      }
    '   }

    '   do {
    '      printf("Anna sana: ");
    '      if (gets(buf) == NULL)
    '         break;

    '      for (i = 0; i < entries; i++) {
    '         if (!strcmp(buf, dict[i].key_)) {
    '            printf("%s\n", dict[i].value_);
    '            break;
    '         }
    '      }
    '      if (i >= entries) {
    '         printf("Ei löytynyt\n");
    '      }
    '   } while (1);
       
    '   for (i = 0; i < entries; i++) {
    '      free(dict[i].key_);
    '      free(dict[i].value_);
    '   }

    '   return 0;
    }

    --------------------------------------------

    Taas noi '-merkit säilyttää indentaation. Ja toi file1.txt pitää sisällään entryn per rivi tabilla eroteltuna.

    Äänestä

  • *BSD kirjoitti:

    Alla olisi yksi ratkaisu. Jos on kyseessä kotitehtävä niin kannattaa kuitenkin miettiä miten toi toimii.

    Yleisesti, ellei ole pakko tehdä nimenomaan C:llä
    niin esim. C++-ratkaisu on siistimpi ja siis suositellumpi. Kaikkein paras toi olis tehdä awk:lla kun se on nimenomaan tommoseen käyttöön tehty :)

    --------------------------------------------

    #include
    #include
    #include
    #include

    struct DictionaryRec {
    '   char *key_;
    '   char *value_;
    };

    int main()
    {
    '   FILE *fp = NULL;
    '   /* Kovakoodattu */
    '   DictionaryRec dict[256];
    '   int i;
    '   int entries = 0;
    '   char buf[81];
    '
    '   fp = fopen("file1.txt", "r");
    '   while (!feof(fp) && entries < 256) {
    '      if (fgets(buf, 80, fp) != NULL) {
    '         char *pos = strchr(buf, '\t');
    '         if (pos != NULL && (pos + 1) != NULL) {
    '            pos++;

    '            size_t key_len = abs(pos - &buf[0]);
    '            dict[entries].key_ = (char *)malloc(key_len);
    '            memset(dict[entries].key_, 0, key_len);
    '            strncpy(dict[entries].key_, &buf[0], key_len - 1);

    '            size_t value_len = strlen(buf) - key_len;
    '            dict[entries].value_ = (char *)malloc(value_len);
    '            memset(dict[entries].value_, 0, value_len);
    '            strncpy(dict[entries].value_, pos, value_len - 1);

    '            entries++;
    '         }
    '      }
    '   }

    '   do {
    '      printf("Anna sana: ");
    '      if (gets(buf) == NULL)
    '         break;

    '      for (i = 0; i < entries; i++) {
    '         if (!strcmp(buf, dict[i].key_)) {
    '            printf("%s\n", dict[i].value_);
    '            break;
    '         }
    '      }
    '      if (i >= entries) {
    '         printf("Ei löytynyt\n");
    '      }
    '   } while (1);
       
    '   for (i = 0; i < entries; i++) {
    '      free(dict[i].key_);
    '      free(dict[i].value_);
    '   }

    '   return 0;
    }

    --------------------------------------------

    Taas noi '-merkit säilyttää indentaation. Ja toi file1.txt pitää sisällään entryn per rivi tabilla eroteltuna.

    Mikä ihme tässä vielä mättää??


    [code]
    #include
    #include

    //SANAKIRJA: Tarkoituksenani on, että kysytään sana käyttäjältä ja etsitään sitten sanaa
    //tiedostosta jos sama sana löytyy tulostetaan seuraava rivi tiedostosta

    //eli jos annat sanan hiiri ja se löytyy tulostuu vastinpariksi mouse
    //ja jos annat mouse tulostuu hiiri
    //tiedosto testi.txt
    /*
    auto
    car
    auto
    */



    int main(void)
    {
    char sana[20];
    char vertaus[20];
    char seuraavaRivi[80];
    int i;
    int j;

    int pituus;
    FILE *auki;



    printf("Anna sana suomeksi tai englanniksi :\n");
    scanf("%s", sana);

    auki=fopen("testi.txt","r");

    if((auki=fopen("testi.txt","r"))==NULL)
    {
    printf("En voi avata tiedostoa");
    }


    fgets(seuraavaRivi,80,auki);

    pituus=(int)strlen(seuraavaRivi);

    //saadaan kopioitua sanat muuttujiin?
    strcpy( vertaus,seuraavaRivi);



    fgets(seuraavaRivi,80,auki);



    //tarkistetaan sanat!! ihan testausta varten
    printf("Tiedostosta %s\n",vertaus);
    printf("Annettu %s",sana);

    //jos sanat ovat samat niin tulostetaan seuraavarivi
    if(strcmp(sana,vertaus)==0)
    {
    for(i=0;i

    Äänestä

  • laura kirjoitti:

    Mikä ihme tässä vielä mättää??


    [code]
    #include
    #include

    //SANAKIRJA: Tarkoituksenani on, että kysytään sana käyttäjältä ja etsitään sitten sanaa
    //tiedostosta jos sama sana löytyy tulostetaan seuraava rivi tiedostosta

    //eli jos annat sanan hiiri ja se löytyy tulostuu vastinpariksi mouse
    //ja jos annat mouse tulostuu hiiri
    //tiedosto testi.txt
    /*
    auto
    car
    auto
    */



    int main(void)
    {
    char sana[20];
    char vertaus[20];
    char seuraavaRivi[80];
    int i;
    int j;

    int pituus;
    FILE *auki;



    printf("Anna sana suomeksi tai englanniksi :\n");
    scanf("%s", sana);

    auki=fopen("testi.txt","r");

    if((auki=fopen("testi.txt","r"))==NULL)
    {
    printf("En voi avata tiedostoa");
    }


    fgets(seuraavaRivi,80,auki);

    pituus=(int)strlen(seuraavaRivi);

    //saadaan kopioitua sanat muuttujiin?
    strcpy( vertaus,seuraavaRivi);



    fgets(seuraavaRivi,80,auki);



    //tarkistetaan sanat!! ihan testausta varten
    printf("Tiedostosta %s\n",vertaus);
    printf("Annettu %s",sana);

    //jos sanat ovat samat niin tulostetaan seuraavarivi
    if(strcmp(sana,vertaus)==0)
    {
    for(i=0;i

    "
    auki=fopen("testi.txt","r");

    if((auki=fopen("testi.txt","r"))==NULL)
    {
    printf("En voi avata tiedostoa");
    }
    "
    ///////////////////////////////////
    avaaat kaksikertaa tuon tiedoston???
    poista ylempi rivi =)

    Äänestä

  • laura kirjoitti:

    Mikä ihme tässä vielä mättää??


    [code]
    #include
    #include

    //SANAKIRJA: Tarkoituksenani on, että kysytään sana käyttäjältä ja etsitään sitten sanaa
    //tiedostosta jos sama sana löytyy tulostetaan seuraava rivi tiedostosta

    //eli jos annat sanan hiiri ja se löytyy tulostuu vastinpariksi mouse
    //ja jos annat mouse tulostuu hiiri
    //tiedosto testi.txt
    /*
    auto
    car
    auto
    */



    int main(void)
    {
    char sana[20];
    char vertaus[20];
    char seuraavaRivi[80];
    int i;
    int j;

    int pituus;
    FILE *auki;



    printf("Anna sana suomeksi tai englanniksi :\n");
    scanf("%s", sana);

    auki=fopen("testi.txt","r");

    if((auki=fopen("testi.txt","r"))==NULL)
    {
    printf("En voi avata tiedostoa");
    }


    fgets(seuraavaRivi,80,auki);

    pituus=(int)strlen(seuraavaRivi);

    //saadaan kopioitua sanat muuttujiin?
    strcpy( vertaus,seuraavaRivi);



    fgets(seuraavaRivi,80,auki);



    //tarkistetaan sanat!! ihan testausta varten
    printf("Tiedostosta %s\n",vertaus);
    printf("Annettu %s",sana);

    //jos sanat ovat samat niin tulostetaan seuraavarivi
    if(strcmp(sana,vertaus)==0)
    {
    for(i=0;i

    Eli sun tiedosto näyttää tältä:
    -------------
    auto
    car
    auto
    kissa
    cat
    kissa
    ...
    -------------

    Sitten käydään tiedostoa läpi kunnes sopiva löytyy?

    Tosta sun koodista puuttuu silmukka, jossa käyt tuota tiedostoa läpi. Sitten toi looppi, jossa tulostat sen sanan on ehkä parempi toteuttaa näin:
    printf("%s\n", seuraavaRivi);

    Seuraava kohta on vaarallinen:
    ' strcpy(vertaus,seuraavaRivi);
    Syystä, että vertaus[20] ja seuraavaRivi[80] on erikokoiset.

    Kannattaa katella sitä aikaisemmin lähettämääni koodia (C:llä) ja miettiä miten sen voisi soveltaa omaasi.

    Äänestä

Kommentoi aloitusta


Laura kirjoitti:

Olen yrittänyt tehdä perus C:llä todella yksinkertaista sanakirjaohjelmaa, joka lukee sanat tekstitiedostosta.... tuloksetta.
Osaan kyllä lukea tiedostosta ohjelmaani, mutten millään keksi miten saisin listalta tulostettua sanan vastin parin eli kirjoitan sanan auto niin pitäisi tulostua bil. Tällä hetkellä tulostuu molemmat.

Eli jos jollakin olisi todella yksinkertainen esimerkki.

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