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.
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.
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?
Ole ystävällinen ja näytä koodi, koska ei tuosta muuten mitään tolkkua saa.
Taitaapi tuo standard output ohjautua oletuksena SDL:n kanssa tiedostoon stdout.txt.
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.
Oli vain oma helppo arvaukseni perustuen käyttäjän mika132 aiempiin viesteihin...
No tässä lähdekoodi:
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?
mika132 kirjoitti:
Ja tosiaan... Se tallentaa tiedot tuonne stdout.txt joten miten sen saa korjattua?
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.
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
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
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); } }
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)'
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ä.
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
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?
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?
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.