Toon posts:

[vc++] windows app. met console en cout combineren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een windows app. en ik wil een console gebruiken om wat debug rommel naartoe te schrijven. Het aanmaken van de console doe ik met
code:
1
2
3
4
int MyConsole =  AllocConsole();
HANDLE hCons = GetStdHandle(STD_OUTPUT_HANDLE);
char * text= "the text!";   
WriteConsole(hCons,text,10,NULL,NULL);


Dit maakt een console aan naast mijn DialogApp en schrijft de text weg. Nu zou ik gebruik willen maken van de console zoals dat met een console application kan via iostream en cout omdat cout erg gemakkelijk werkt. Je hoeft je niet druk te maken of je ints of strings of chars wegschrijft, of de lengte ervan. (zoals in dit voorbeeld met writeconsole)
Hoe kan ik ervoor zorgen dat cout zijn buffer wegschrijft naar mijn console(handle)?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
ostreams schrijven altijd via een streambuf. Deze streambuf kun je vervangen door een eigen (via .rdbuf( ) ). Als je dus een streambuf maakt die z'n output via WriteConsole schrijft, en die in std::cout duwt, dan gaat de output daarheen. Dit werkt idd, ik heb (helaas copyrighted) code die precies dat doet.

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

bliep, niet nodig, gelukkig is er freopen () :)

doe dit na je AllocConsole () :
C++:
1
2
freopen ("con", "r", stdin);
freopen ("con", "w", stdout);


en tadaa, stdin en stdout zijn reassigned, en cin en cout werken ook direct

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Bedankt voor jullie replies. De optie met freopen klinkt superrelaxed, maar ik krijg het niet aan het werk. MSDN over freopen:
code:
1
FILE *freopen( const char *path, const char *mode, FILE *stream );

en een MSDN voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>

FILE *stream;

void main( void )
{
   /* Reassign "stderr" to "freopen.out": */
   stream = freopen( "freopen.out", "w", stderr );

   if( stream == NULL )
      fprintf( stdout, "error on freopen\n" );
   else ....

Moet ik dan niet op een of andere manier direct naar de console verwijzen? Waar staat "con" voor in jou voorbeeld?

Verwijderd

Topicstarter
Nog wat info over freopen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Return Value

Each of these functions returns a pointer to the newly opened file.
If an error occurs, the original file is closed and the function
returns a NULL pointer value.

Parameters

path

Path of new file

mode

Type of access permitted

stream

Pointer to FILE structure

[ Voor 3% gewijzigd door Verwijderd op 26-02-2003 13:26 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 26 February 2003 @ 13:24:
Moet ik dan niet op een of andere manier direct naar de console verwijzen? Waar staat "con" voor in jou voorbeeld?


con is een device onder windows. Je kunt het openen als een file, maar het is eigenlijk de console.

Dus wat je doet is: je opent de console opnieuw in stdin en stdout

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

con staat in dit geval voor de console. Typ in een dos box maar eens 'copy con blub'. Je kunt in windows ook CONIN$ en CONOUT$ gebruiken om te verwijzen naar de console streams, je krijgt dan het volgende:

C++:
1
2
3
4
AllocConsole();
freopen("CONIN$", "rb", stdin);
freopen("CONOUT$", "wb", stdout);
freopen("CONOUT$", "wb", stderr);


Beide voorbeelden zijn volgens mij letterlijk over te nemen als ik me niet vergis.

Verwijderd

Topicstarter
OK Het werkte al wel. Raar alleen:
Ik heb de code ge-copypasted vanuit tweakers naar mijn c++ code. Daar stond dus letterlijk
code:
1
2
freopen ("con", "r", stdin); 
freopen ("con", "w", stdout);

Bij het compilen krijg ik steeds de foutmelding: error C2018: unknown character '0xa0'

Ik heb nu die twee regels OVERGETYPT en nu staat er:
code:
1
2
freopen("con","r",stdin);
freopen("con","w",stdout);


en dat werkt dus wel... snap ik het snap jij het?
Bedankt!
[edit] Spaties mogen dus niet in de argumentenlijst van freopen.

[ Voor 18% gewijzigd door Verwijderd op 26-02-2003 13:38 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 26 februari 2003 @ 13:36:
con staat in dit geval voor de console. Typ in een dos box maar eens 'copy con blub'. Je kunt in windows ook CONIN$ en CONOUT$ gebruiken om te verwijzen naar de console streams, je krijgt dan het volgende:

C++:
1
2
3
4
AllocConsole();
freopen("CONIN$", "rb", stdin);
freopen("CONOUT$", "wb", stdout);
freopen("CONOUT$", "wb", stderr);


Beide voorbeelden zijn volgens mij letterlijk over te nemen als ik me niet vergis.


ik zou ze alleen niet openen als binary ;)
Verwijderd schreef op 26 februari 2003 @ 13:37:
Bij het compilen krijg ik steeds de foutmelding: error C2018: unknown character '0xa0'
waarschijnlijk een newline error

dat spatie argument is onzin :)

[ Voor 3% gewijzigd door .oisyn op 26-02-2003 13:39 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1