Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++, PHP: Tiedostoon kirjoitus / lukeminen

Sivun loppuun

mika132 [14.11.2010 15:32:35]

#

Eli olen lukenut ofstreamistä fwritestä yms mutta en onnistu millään kuin kirjoittamaan yhdelle riville.. Miten voin hankkia tietoa esim näin:

Corolla | 1.3L | 16 | 60 | 80 | 1200|
Escort | 1.6L | 16 | 80 | 90 | 2000|

Eli tiedot ovat.
Merkki | moottoritilavuus | Venttiilit | Auton kunto | renkaiden kunto | Hinta

Eli miten voin kirjoittaa noin tietoa ja sitten ottamaan sitä pihalle rivi kerrallaan. PHP:ssä se onnistuu explodella, mutta en löytänyt sellaisesta oikeastaan mitään C++ liittyen. Enkä edes saa kirjoitettua tietoa jostain syystä tuolla tavalla vaan kaikki menee yhdeksi pötköksi.

Teuro [14.11.2010 15:44:56]

#

No olen tännekin kirjoittanut tällaisen vinkin, joka sopinee tuohon hommaan kuin nenä päähän. Luonnollisesti numerot pitää muuntaa oikeaan muotoon, jotta toimisi odotetusti. Yksi vaihtoehto on muuntaa stringstreamien avulla.

mika132 [14.11.2010 20:33:10]

#

Nyt tuli tosi tyhmä ongelma. Olen tuolla std::cout:illa koittanut saada tekstiä tulostumaan, mutta ei.. Se ei Konsoli on koko ajan pelkkää mustaa. koitin myös sillä clog:lla jota matopelissä käytettiin sama juttu.. Mitä olen mahtanut unohtaa?

Teuro [14.11.2010 20:34:31]

#

Ole ystävällinen ja näytä koodi, koska ei tuosta muuten mitään tolkkua saa.

jalski [14.11.2010 20:37:06]

#

Taitaapi tuo standard output ohjautua oletuksena SDL:n kanssa tiedostoon stdout.txt.

Teuro [14.11.2010 20:39:43]

#

Niin jos taas käytetään SDL:ä, mutta kun puhutaan konsolista, niin eipä tullut moinen edes mieleen. Toisaalta aloittajalle on muistaakseni ainakin kerran annettu toimiva korjaus tuon tulosteen ohjaukseen.

jalski [14.11.2010 20:42:20]

#

Oli vain oma helppo arvaukseni perustuen käyttäjän mika132 aiempiin viesteihin...

mika132 [14.11.2010 20:50:40]

#

No tässä lähdekoodi:

Koodi

Ja tosiaan SDL:n kanssa koitan mutta tarkoitus on tulostaa erillaisia arvoja / tapahtumia konsoliin, jotta nään pelaako ne oikein.

Ja tosiaan... Se tallentaa tiedot tuonne stdout.txt joten miten sen saa korjattua?

-tossu- [14.11.2010 20:54:15]

#

mika132 kirjoitti:

Ja tosiaan... Se tallentaa tiedot tuonne stdout.txt joten miten sen saa korjattua?

http://www.libsdl.org/cgi/docwiki.cgi/FAQ_Console

Metabolix [14.11.2010 21:06:22]

#

SDL:n wiki on vanhentunut. SDL 1.2.14 sisältää lähettämäni muutoksen, jonka ansiosta ongelman voi korjata ympäristömuuttujalla SDL_STDIO_REDIRECT. Voit siis ajaa ohjelman komentoriviltä näin:

SDL_STDIO_REDIRECT=0 omaohjelma.exe

Ympäristömuuttujan tai koko ajokomennon voi ehkä asettaa myös projektin asetuksiin.

mika132 [15.11.2010 16:07:49]

#

En nyt saanut tuota konsolista toimintaan, mutta testasin sitten toista tyyliä.. Eli luen mitä "konsoliin" pitäisi tulostau tuosta tiedon hausta tiedostosta.. Tulos on tälläinen.

Rivi ei tue | erotinta
Rivi ei tue | erotinta
Rivi ei tue | erotinta
Rivi ei tue | erotinta
Rivi ei tue | erotinta

Käytän tätä koodia

Otin siitä kaikki talteen.. Jopa sen mitä tiedostossa voisi olla sisällä. Tässä nyt vielä mitä se tiedosto sisältää... Muuten koodi on täysin samallaista kuin tuossa koodivinkissä..

Juha|Helsinki|30.5|13
Pekka|Vantaa|15.32|4
Janne|Sipoo|28.57|8
Riikka|Tuusula|26.37|13

Metabolix [15.11.2010 17:04:58]

#

Teuron koodissa on useampikin virhe, jotka listasin korjauksineen vinkin kommentiksi.

Alkuperäiseen kysymykseen kuitenkin suosittelisin ennemmin järkevän formaatin käyttöä kuin tukeutumista PHP:stä opittuihin konsteihin. Tiedostoa olisi helppo lukea ja tulostaa esimerkiksi näin:

#include <string>
#include <iostream>
#include <fstream>
#include <limits>

struct AutonTiedot {
  std::string malli;
  int venttiilit;
  double hinta;
};

void tulosta(std::ostream& virta, AutonTiedot const& a) {
  // Tulostetaan arvot tabulaattorilla eroteltuina.
  virta << a.malli << '\t' << a.venttiilit << '\t' << a.hinta << std::endl;
}

void lue(std::istream& virta, AutonTiedot& a) {
  // Malli on ennen ensimmäistä tabulaattoria.
  std::getline(virta, a.malli, '\t');

  // Muut tiedot saadaan yksittäisinä sanoina.
  virta >> a.venttiilit >> a.hinta;

  // Ohitetaan tiedot rivin loppuun asti.
  virta.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

int main() {
  bool tallenna = true, lataa = true;
  if (tallenna) {
    std::ofstream virta("autot.txt");
    AutonTiedot a = {"Hyvä Mersu", 16, 1999.99};
    AutonTiedot b = {"Huono Sitikka", 2, 129.99};
    tulosta(virta, a);
    tulosta(virta, b);
  }
  if (lataa) {
    std::ifstream virta("autot.txt");
    AutonTiedot a, b;
    lue(virta, a);
    lue(virta, b);
    tulosta(std::cout, a);
    tulosta(std::cout, b);
  }
}

mika132 [18.11.2010 19:31:25]

#

hmm.. Koitin soveltaa koodiasi SDL_ttf:n tyyliin kirjoittaa tekstiä.. Eli tekstin lataus funktioksi, mutta se ei ihan toimi.

Ensimmäiseks namespace Game::Tekstit jossa tuo funkti oesitellään

namespace Tekstit {
    static SDL_Surface *tulosta(std::ostream& virta, AutonTiedot const& a, TTF_Font *fontt);
    static SDL_Surface *LoadText(const char *text, bool muuttuja, int muuttujan_arvo, TTF_Font *fonttodraw, int Red, int Green, int Blue);
    static SDL_Surface *text_1, *text_2, *text_3, *text_4, *text_5, *text_6, *text_7, *text_8, *text_9, *text_10, *text_11, *text_12, *text_13, *text_14;
    static SDL_Surface *text_15, *text_16, *text_17, *text_18, *text_19, *text_20, *text_21, *text_22;
}

Sitten funktion sisältö.

static SDL_Surface *Game::Tekstit::tulosta(std::ostream& virta, AutonTiedot const& a, TTF_Font *fontt) {
    virta << a.malli << '\t' << a.venttiilit << '\t' << a.hinta << std::endl;
    SDL_Color textcolor = {255,0,0};
    SDL_Surface *tex = TTF_RenderText_Blended(fontt, virta, textcolor);
    return tex;
}

Tässä se kohta jossa teksti ladataan:

Tekstit::text_20 = Tekstit::tulosta(std::cout, a, Fontit::font2);

ja errorit:

error: invalid conversion from 'void*' to 'const char*'

error: initializing argument 2 of 'SDL_Surface* TTF_RenderText_Blended(TTF_Font*, const char*, SDL_Color)'

Metabolix [18.11.2010 19:48:36]

#

Mitä jos seuraavaksi kertoisit, mitä ihmeen tekemistä tiedostoon kirjoittamisella ja SDL_ttf:llä on keskenään? O_o

Vastaus: Ei mitään. Jos haluat muuttaa arvoja tekstiksi, voit kuitenkin tulostaa ostringstream-olioon, kuten tässä vinkissä.

mika132 [20.11.2010 14:09:24]

#

Juu.. Tuota hain. Taisin selittää väärin / muuttaa koodin väärin. :)

Kiitos. :)


Joten.. Koitinpa sitten uutta kikkaa, mutta sepä heitti erroria..

error: conversion from 'AutonTiedot' to non-scalar type 'std::string' requested"

std::ifstream virta("PlayersData.dat");
AutonTiedot a, b;
tulosta(std::cout, a); //Tulostaa nää iha ihmeellisesti konsolii
tulosta(std::cout, b); //Tulostaa nää iha ihmeellisesti konsolii

std::string Auton_merkki = a

Tässä konsoli tulostuksen tulos:
2292732 5.2827e-308
2009186349 2.3344e-313

Metabolix [20.11.2010 14:18:54]

#

Sanopa nyt, mitä a ja b sinusta sisältävät, kun missään vaiheessa sijoita nihin mitään, ja mitä ihmettä muka pitäisi tapahtua, kun yrität sijoittaa AutonTiedot-rakenteen string-olioon?

mika132 [22.11.2010 22:09:23]

#

Taisin vihdoin hokata kun katselin tuota lue funktiota, että sillä luetaan, mutta miten saan sillä luettua? En oikein osaa käyttää sitä oikein..

void lue(std::istream& virta, AutonTiedot& a) {
  std::getline(virta, a.malli, '\t');
  virta >> a.venttiilit >> a.hinta;
  virta.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

Jos muutan sen esim string funktioksi ja palautan arvon.. Minkä arvon?

Metabolix [22.11.2010 22:14:33]

#

Annoin ihan kokonaisen, toimivan koodin. Kokeilitko? Perehdyitkö sen toimintaan? Osaatko kommentoida rivi kerrallaan, mitä missäkin tapahtuu? Koodissa ei ole mitään ihmeellistä, joten jos jotain jäi vielä ymmärtämättä, palaa taas kerran alkeisiin ja mieti järjellä, mitä rivillä loogisesti edes voisi tapahtua.

Mitä esimerkiksi lue-funktiossa tapahtuu? Mitä funktion parametrit ovat? Mihin luetut tiedot tallentuvat? Mihin tiedot siis päätyvät esimerkkiohjelmassani?

Älä yritäkään tunkea mitään oman koodisi sekaan, ennen kuin olet ihan varma kaikesta.


Sivun alkuun

Vastaus

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

Tietoa sivustosta