Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ulkoiset tiedostot

Sivun loppuun

mika132 [22.10.2009 15:53:18]

#

En löytänyt oppaita tätä varten, mutta miten voin etsiä toisesta tiedostosta muuttujat ja katsoa onko kaksi muuttujaa samallaisia?

Eli pitäisi saada main.cpp tiedostoon väliaikaisesti sanat.cpp. Asian toteutan nyt niin, että on muuttuja "sana" ja kun kirjoitetaan jotain ja painetaan entteriä avataan funktio sana_tarkastus, nyt tuonne pitäisi saada includetettua tuo sanat.cpp jotta se voisi tarkistaa, mutta ei onnistu. Se valittaa, ette tiedä mikä on sana muuttuja ja ei varmaan tiedäkkään, kun kyseessä on kaksi eri tiedostoa.

Sitten se, että miten saan helposti tarkistettua 20 erinimistä muuttujaa, että onko samallaisia?

Jos ei ole pitäisi sana.cpp:hen lisätä uusi koodi rivi automaattisesti jossa on tämä uusi sana. menee vaikeaksi? Toivon, että autatte. Ja kiitos jos autatte. :O

vehkis91 [22.10.2009 16:35:53]

#

Katos noista.
https://www.ohjelmointiputka.net/koodivinkit/25174-cpp-koodin-jakaminen-eri-tiedostoihin-cpp-luokat
https://www.ohjelmointiputka.net/koodivinkit/25046-c-koodin-jakaminen-eri-tiedostoihin

Edit, siis jos sitä tiedostoa pitää pystyä muokaan, niin teet ihan perus tiedostonkäsittelyllä (fstream) jonkin tekstitiedoston missä on vaikka joka rivillä yksi sana ja sitten tarkistat onko ohjelmassa kyseistä sanaa. Jos taas lista on staattinen, niin silloin voit noiden kahden linkin avulla liittää sen sanat.cpp tiedoston projektiisi.

Ja monen muuttujan vertailuun vastauksena, taulukot ja for looppi.

mika132 [22.10.2009 17:33:06]

#

Taitaa staattinen olla parhain, koska sanoja on kielteisiä möynteisiä, kysymyksiä jne. Eli laitan vain sanat esimerkiksi:

string tervehdys_1="Moi";
string tervehdys_2="Terve";
string tervehdys_3="Heippa";
string kysymys_1="Mitä kuuluu?";


no miten sitten onnistuu, jos sanaa ei löydykkään ja se lisätään vaikka tervehdys_4 nimellä tiedostoon? Miten saan sen automaattisesti hoitamaan tuon?

vehkis91 [22.10.2009 17:46:31]

#

Jos teet tyyliin #include "xxxxx" niin et voi lisätä sinne yhtään mitään ohjelman käännön jälkeen.

ELI OPETTELE SITÄ TIEDOSTONHALLINTAA!!!!

mika132 [22.10.2009 17:50:21]

#

no kerrotkos sitten sen verran vielä, että pitää käyttää siis esim sana.dat tiedostoja ja etsiä sieltä jostain riviltä sana?

Ei tuollaiseen mitään opasta olisi suomeksi, kun google löysi vain enklanniksi. :/

vehkis91 [22.10.2009 18:29:53]

#

Tuossa ohjelma joka lukee tekstitiedostosta sanoja ja vertaa niitä annettuun sanaan, saat itse tehdä kirjoituksen...

#include <iostream>
#include <vector>
#include <string>
#include <fstream>

std::vector<std::string> lueTiedosto(std::string fileName);

int main()
{
    //Luodaan vectori
    std::vector<std::string> sanat;
    //sana mitä etsitään
    std::string sana = "lol";

    sanat = lueTiedosto("tiedosto.dat");

    //Jos onnistui
    if(sanat.size())
    {
        for(unsigned short int i = 0; i < sanat.size(); i++)
        {
            if(sanat[i] == sana)
                std::cout<<"Löytyi riviltä: "<<i+1<<std::endl;
        }
    }


    std::cin.get();
    return 0;
}

std::vector<std::string> lueTiedosto(std::string fileName)
{
    //Luodaan vectori joka palautetaan
    std::vector<std::string> sanat;

    //Temp string
    std::string tmp;

    std::cout<<"Luetaan tiedostoa: "<<fileName<<"..."<<std::endl;

    //Avataan tiedosto
    std::ifstream fin;
    fin.open(fileName.c_str());

    //Jos onnistui
    if(fin)
    {
        //Loopataan kunnes tiedosto loppuu
        while(!fin.eof())
        {
            //Luetaan tiedostosta rivi
            std::getline(fin, tmp);
            //ja tallennetaan se vectoriin
            sanat.push_back(tmp);
        }

        std::cout<<"Valmis!"<<std::endl;
        //Suljetaan tiedosto
        fin.close();
    }

    //palautetaan vectori
    return sanat;
}

Ja vielä tiedosto.dat

omena
lol
asd
lol
testi
sana
joku
omena
lol

Hyvin toimi ainakin mulla, eli tulosti miltä riviltä löytyi sana.

Metabolix [22.10.2009 18:38:03]

#

Tässä on esimerkki, jossa tiedon nimi ja arvo ovat tiedostossa peräkkäisillä riveillä (joten tieto ei saa sisältää rivinvaihtoa!). Tietoja voi lisätä ja hakea muttei poistaa. (Poistaminen vaatisi, että koko tiedosto kirjoitettaisiin uusiksi poistettavasta kohdasta alkaen.) Toivottavasti luet koodin huolella ja yrität oikein kovasti ymmärtää siitä kaiken; mitään ihmeellistä siinä ei ole! Esimerkki on epäoptimaalinen ja yksinkertainen, jotta varmasti ymmärtäisit sen.

#include <fstream>

const char *tiedosto = "tiedot.dat";

void lisaa(const std::string& nimi, const std::string& arvo) {
  // Avataan tiedosto laajentamista (append) varten.
  std::ofstream ofs(tiedosto, std::ios::app);
  // Tulostetaan kaksi riviä: nimi ja arvo.
  ofs << nimi << std::endl;
  ofs << arvo << std::endl;
}

bool hae(const std::string& haettava, std::string& tulos) {
  // Avataan tiedosto lukemista varten.
  std::ifstream ifs(tiedosto);

  // Luetaan aina nimi ja arvo.
  std::string nimi, arvo;
  while (std::getline(ifs, nimi) && std::getline(ifs, arvo)) {
    // Jos nimi vastaa haettavaa, tallennetaan tulos ja lopetetaan.
    if (nimi == haettava) {
      tulos = arvo;
      return true;
    }
  }
  // Ei osumaa, tallennetaan tulokseksi tyhjä ja palautetaan false.
  tulos = "";
  return false;
}

#include <iostream>

int main() {
  std::string arvo;
  // Jos juttu löytyy, tulostetaan se, muuten lisätään uusi juttu.
  if (hae("juttu", arvo)) {
    std::cout << "juttu: " << arvo << std::endl;
  } else {
    lisaa("juttu", "Olipa kerran mika132, joka...");
    std::cout << "Kirjoitettiin uusi juttu." << std::endl;
  }
}

mika132 [22.10.2009 18:47:35]

#

kiitoksia paljon. :)

Niin tein niiden ohjeiden mukaan mitkä sain sen PDcursesin, mutta PDCurses ei edellenkään toimi.

muutin sieltä vcwin32.mak tiedostosta seuraavan kohdan:
PDCURSES_SRCDIR= ...
tähän:
C:\PDcurses

Tämä oli ohjeena

Errorit:

1>Linking...
1>pdcurses.lib(d000134.o) : warning LNK4078: multiple '.text' sections found with different attributes (E0000020)
1>World Leaders 2.obj : error LNK2001: unresolved external symbol _stdscr
1>C:\Documents and Settings\Mika.KOTI-8FEC3C6EF1\Omat tiedostot\Visual Studio 2008\Projects\World Leaders 2\Debug\World Leaders 2.exe : fatal error LNK1120: 1 unresolved externals

vehkis91 [22.10.2009 18:48:29]

#

Hmm toi mun juttu tais olla vähän liian monimutkainen aloittelijalle... :P

mika132 [22.10.2009 18:53:29]

#

Juu, mutta hokasin pää perjaatteen, kun luin kummankin, mutta projekti on seisaallaan niin kauan, kun joku tai keksin mikä tuota PDCursesia riivaa. 2vrk jo kulunut siihen, kun olen sitä miettinyt ja kysellyt täällä.

goala [27.10.2009 11:08:31]

#

Jos SQL on tuttu, tähän voisi olla kätevä vaikkapa SQLite. Näin olisi varsin helppoa lisäillä, poistaa ja muokata sanoja.

mika132 [27.10.2009 12:20:51]

#

Toimiiko se täysin samalla tavalla kuin normaali SQL, nimittäin olen SQL:ää 2 vuotta käyttänyt PHP:n kanssa.

Grez [27.10.2009 13:50:55]

#

Eiköhän kaikki SQL-kannat toimi samalla tavalla kuin "normaali SQL", tuskin niitä muuten edes kutsuttaisiin SQL:ksi.

Sinänsä "normaali SQL" on aika epäselvä käsite, mutta kaikkien käyttö kuitenkin on samanlaista, strukturoidulla kyselykielellä kyselemistä.

Metabolix [27.10.2009 14:00:34]

#

Kannattaa kuitenkin muistaa, että C(++) ei toimi samalla tavalla kuin PHP, eli myös "normaalin SQL:n" käyttö on siinä selvästi mutkikkaampaa.

goala [27.10.2009 14:48:14]

#

Metabolix kirjoitti:

Kannattaa kuitenkin muistaa, että C(++) ei toimi samalla tavalla kuin PHP, eli myös "normaalin SQL:n" käyttö on siinä selvästi mutkikkaampaa.

Näinhän se on. Tosin täältä löydät loistavan C++-wrapperin SQLite3:lle.
Esim. katso, kuinka näppärää on ihan peruskomennon teko:

sqlite3pp::database db("test.db");
sqlite3pp::command cmd(db, "INSERT INTO contacts (name, phone) VALUES (?, ?)");

cmd.bind(1, "mika132");
cmd.bind(2, "1234567");

cmd.execute();

Jopa transactionit on helppoja:

sqlite3pp::transaction xct(db);
{
        sqlite3pp::command cmd(db, "INSERT INTO contacts (name, phone) VALUES (:user, :phone)");

        cmd.bind(":user", "mika132");
        cmd.bind(":phone", "1234567");

        cmd.execute();
}

xct.rollback(); // Tai jos xct tuhotaan, niin commit. Tai ihan vain xct.commit().

Helppoa, eikö?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta