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.
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.
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
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.
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 =)
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.