[C++] Generieke output en afsluiten opvangen *

Pagina: 1
Acties:

  • Coca-Cola
  • Registratie: Maart 2001
  • Nu online
Ik ben op dit moment bezig een programma te schrijven en ik ben tegen 2, voor mij, wat lastige dingen aangelopen.
Ten eerste, ik wil ergens mijn code wat informatie wegschrijven. Nou is dit niet zo'n probleem, alleen ik wil op dat moment bepalen of het naar het scherm, of naar een file moet. Nu heb ik daar binnen een class 2 functies voor gemaakt, nl. show en save. Deze functies doen precies hetzelfde, alleen de een naar een file (file << "info" << endl;) en de ander naar het scherm (cout << "info" << endl;). Mij zou het het makelijkst lijken als ik gewoon 1 functie heb, die ik een stream mee kan geven, waar naartoe geschreven moet worden. Ik heb alleen geen idee of dit uberhaupt kan en zo ja hoe.
Ten tweede, Ik wil als mijn programma door de user wordt afgesloten (end process, kill, ctrl+c etc.) de data van mijn process weg kunnen schrijven. Hoe vang/handel ik zoiets af?

Voor het eerste probleem heb ik wel al door de stream man pages gebladert en gezocht naar voorbeelden, maar nog niks kunnen vinden. Voor het tweede probleem ben ik wel <signal.h> tegengekomen en dat werkt ook wel, alleen ik wil een functie van een class gebruiken ipv een globale, anders kan ik niet bij de info die moet worden weggeschreven (tenzij ik het object globaal maak ofzo, maar dat lijkt mij niet het beste)

Bvd!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Coca-Cola schreef op 29 juli 2004 @ 13:29:
Ik ben op dit moment bezig een programma te schrijven en ik ben tegen 2, voor mij, wat lastige dingen aangelopen.
Ten eerste, ik wil ergens mijn code wat informatie wegschrijven. Nou is dit niet zo'n probleem, alleen ik wil op dat moment bepalen of het naar het scherm, of naar een file moet. Nu heb ik daar binnen een class 2 functies voor gemaakt, nl. show en save. Deze functies doen precies hetzelfde, alleen de een naar een file (file << "info" << endl;) en de ander naar het scherm (cout << "info" << endl;). Mij zou het het makelijkst lijken als ik gewoon 1 functie heb, die ik een stream mee kan geven, waar naartoe geschreven moet worden. Ik heb alleen geen idee of dit uberhaupt kan en zo ja hoe.
Tip: alle outputstreams zijn van std::ostream afgeleid.
Ten tweede, Ik wil als mijn programma door de user wordt afgesloten (end process, kill, ctrl+c etc.) de data van mijn process weg kunnen schrijven. Hoe vang/handel ik zoiets af?
Kill kun je niet afvangen (daar heet het kill voor), voor Ctrl-C kun je een signal handler implementeren.
[...] <signal.h> tegengekomen en dat werkt ook wel, alleen ik wil een functie van een class gebruiken ipv een globale, anders kan ik niet bij de info die moet worden weggeschreven (tenzij ik het object globaal maak ofzo, maar dat lijkt mij niet het beste)
Je kunt C-style callbacks niet naar een C++ member method omleiden, omdat een pure functiepointer daarvoor informatie mist (de class instance om exact te zijn). Om deze reden heb je normaliter bij de meeste callbacks (thread starts e.d.) een void* context-parameter, maar bij signal geloof ik idd niet. Dan zul je dus met globals moeten werken idd om aan de info te komen.

Professionele website nodig?


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

edit: na reactie hierboven, was mijn reactie nogal useless

[ Voor 84% gewijzigd door H!GHGuY op 29-07-2004 13:35 ]

ASSUME makes an ASS out of U and ME


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Een 2e optie voor die outputfunctie is overigens een templateconstructie:
C++:
1
2
3
4
5
template <class T, class U>
inline void OutputAnythingToAnything(T &any, const U &data)
{
any << data;
}

:)

Professionele website nodig?


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Er is een klein probleem met het signal->save idee; je mag in een signal handler de standaard library niet gebruiken. (Lees: signals zijn een UNIX hack die in C terecht zijn gekomen, maar niet echt).

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • gammuts
  • Registratie: April 2001
  • Laatst online: 03-04 11:25
Coca-Cola schreef op 29 juli 2004 @ 13:29:
...Mij zou het het makelijkst lijken als ik gewoon 1 functie heb, die ik een stream mee kan geven, waar naartoe geschreven moet worden.
Ik heb alleen geen idee of dit uberhaupt kan en zo ja hoe.
Is dit wat je wilt?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <fstream>

class Foo
{
  unsigned m_u;
public:
  Foo(unsigned u)
  : m_u(u)
  {}

  void writeData(std::ostream &output_stream)
  { output_stream << m_u << std::endl; }
};

int main()
{
  Foo bar(42);
  std::cout << "Dumping data to cout..." << std::endl;
  bar.writeData(std::cout);

  std::ofstream file("temp.txt");
  std::cout << "Dumping data to temp.txt." << std::endl;
  bar.writeData(file);

  return 0;
}

use strict; use warnings;


  • RobLemmens
  • Registratie: Juni 2003
  • Laatst online: 15-05 17:26
quote:

Je kunt C-style callbacks niet naar een C++ member method omleiden, omdat een pure functiepointer daarvoor informatie mist (de class instance om exact te zijn).


je kunt ze als friend definieren van de klasse. dan is de this pointer geldig

  • Coca-Cola
  • Registratie: Maart 2001
  • Nu online
gammuts schreef op 29 juli 2004 @ 20:36:
[...]


Is dit wat je wilt?
dat is idd precies wat ik wil! ik ga het ff testen maar in ieder geval vast bedankt :)

Is er trouwens voor het afvangen van ctrl-c niet iets anders mogelijk? Ik snap dat het geen exception is, maar is er geen soort try... catch mechanisme mogelijk in de main of iets anders, wat meer c++ dan die (lelijke) signal(SIGINT, functie) constructie?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

gammuts schreef op 29 juli 2004 @ 20:36:
[...]


Is dit wat je wilt?
* curry684 probeerde dit nog subtiel met een hint aan te geven ipv de hele code te geven :X
RobLemmens schreef op 29 juli 2004 @ 21:26:
je kunt ze als friend definieren van de klasse. dan is de this pointer geldig
Uhm nee, dat is onzin. Friends regelen enkel toegangscontrole tot protected en private members. Je bedoelt waarschijnlijk dat een static class method wel een geldige C-style functie is, maar zoals bekend heb je in een static class ook geen instance....

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Coca-Cola schreef op 29 juli 2004 @ 21:50:
[...]


dat is idd precies wat ik wil! ik ga het ff testen maar in ieder geval vast bedankt :)

Is er trouwens voor het afvangen van ctrl-c niet iets anders mogelijk? Ik snap dat het geen exception is, maar is er geen soort try... catch mechanisme mogelijk in de main of iets anders, wat meer c++ dan die (lelijke) signal(SIGINT, functie) constructie?
Misschien even stomme vraag, maar welk platform hebben we het over? Dat scheelt bij het beantwoorden van dit soort zoals MSalters al aangaf ENORM platformspecifieke problemen :)

Professionele website nodig?


  • Coca-Cola
  • Registratie: Maart 2001
  • Nu online
sorry, je hebt helemaal gelijk... Ik schrijf het onder windows, maar het moet draaien onder zowel windows als linux.

  • gammuts
  • Registratie: April 2001
  • Laatst online: 03-04 11:25
curry684 schreef op 29 juli 2004 @ 21:54:
[...]

* curry684 probeerde dit nog subtiel met een hint aan te geven ipv de hele code te geven :X
Soms is voorzetten niet genoeg... Dit keer dan maar snoeihard de bal in het net geschoten >:). Ik snapte je tip natuurlijk wel, maar van Coca-Cola wist ik het niet zeker.

Maaruh, http://www.icce.rug.nl/documents/cplusplus/ is een mooi e-book, waarvan hoofdstuk 5 relevant is. Da's mijn naslagwerk/bijbel voor C++.

use strict; use warnings;


  • Coca-Cola
  • Registratie: Maart 2001
  • Nu online
Hoho, ik kan best programeren en ook zelf dingen uitzoeken is niet een heel groot probleem. Ik zit nu echter tegen een deadline en ik was al bezig met me in te lezen in het hele stream gebeuren en wist ook wel waar ik het ongeveer moest zoeken. Ik vroeg me alleen af of het uberhaupt mogelijk was en was met je tip ook al heel blij hoor :P
Het vervelende van C++ is dat je soms door de bomen het bos ff niet meer ziet ;) De mogelijkheden lijken soms idd wel onbeperkt en dat maakt het uitzoeken vaak zo'n werk
Pagina: 1