Ga naar inhoud

c++: pipes


Aanbevolen berichten

Ik heb een c++ programma geschreven en ik wil de output van een andere programma in kunnen lezen op de commandline, bijv.: 'cdrecord -optie' geeft als output: 1234,5678 vervolgens wil ik deze output in kunnen lezen, zoals je dat ook kunt doen onder de commandline alleen dan dus met c++: 'kutcd 1234,5678' waarbij '1234,5678' dus de output is van cdrecord. Hoe doe je dit? Ik heb me rot gezocht op google en het niet kunnen vinden. Het komt er op neer dat de output van het ene programma naar het andere programma gepiped wordt.
Link naar reactie
Ik gebruik de opdracht 'system()' om een extern commando vanuit c++ op de commandline uit te voeren: system("clear"); Maar soms heeft dat commando een output die ik nodig heb in het c++ programma vanuit welke die wordt aangeroepen: system("cdrecord -multisessioninfo"); voert cdrecord uit en geeft een string op het scherm. Ik wil die string vervolgens in een variabele inlezen en ik weet niet hoe dat moet. Ik heb namelijk een frontend geschreven voor cdrecord en ik heb de output van cdrecord -nogwattus nodig binnen dat frontend. Vandaar.
Link naar reactie
[quote:1a8cb498d0="computerbacterie"]Ik heb een c++ programma geschreven en ik wil de output van een andere programma in kunnen lezen op de commandline, bijv.: 'cdrecord -optie' geeft als output: 1234,5678 vervolgens wil ik deze output in kunnen lezen, zoals je dat ook kunt doen onder de commandline alleen dan dus met c++: 'kutcd 1234,5678' waarbij '1234,5678' dus de output is van cdrecord. Hoe doe je dit? Ik heb me rot gezocht op google en het niet kunnen vinden. Het komt er op neer dat de output van het ene programma naar het andere programma gepiped wordt.[/quote:1a8cb498d0] [url=http://forum.computertotaal.nl/phpBB2/viewtopic.php?p=422808#422808]Op basis van deze posting... 8)[/url] Deze werkt zonder tussenbestand... [code:1:1a8cb498d0] function GetOutput(const CommandLine:string): string; var SecurityAttributes: TSecurityAttributes; StartupInformation: TStartupInfo; ProcessInformation: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of Char; BytesRead: Cardinal; Line: String; begin Application.ProcessMessages; SecurityAttributes.nLength := SizeOf(SecurityAttributes); SecurityAttributes.bInheritHandle := True; SecurityAttributes.lpSecurityDescriptor := Nil; CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SecurityAttributes, 0 ); try ZeroMemory(@StartupInformation, SizeOf(StartupInformation)); StartupInfo.cb := SizeOf(StartupInformation); StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; StartupInfo.wShowWindow := SW_HIDE; StartupInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); StartupInfo.hStdOutput := StdOutPipeWrite; StartupInfo.hStdError := StdOutPipeWrite; WasOK := CreateProcess(Nil, PChar(CommandLine), Nil, Nil, True, 0, Nil, Nil, StartupInformation, ProcessInformation); CloseHandle(StdOutPipeWrite); if not WasOK then raise Exception.Create('Could not execute command line!') else try Line := ''; repeat WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); if BytesRead > 0 then begin Buffer[BytesRead] := #0; Line := Line + Buffer; end; until not WasOK or (BytesRead = 0); WaitForSingleObject(ProcessInformation.hProcess, INFINITE); finally CloseHandle(ProcessInformation.hThread); CloseHandle(ProcessInformation.hProcess); end; finally result:=Line; CloseHandle(StdOutPipeRead); end; end; mijnVariabele := GetOutput('cdrecord -optie'); [/code:1:1a8cb498d0] Zelf ff (recht-toe-recht-aan) vertalen.
Link naar reactie
Daar begrijp ik helemaal niets van. Als het zo moeilijk is dan hou ik het wel bij een tussenbestand. Dat is veel simpeler en ziet er zo uit: ... ifstream msinfotmp; msinfotmp.open("msinfo.tmp"); msinfotmp >> multisessionstring; if(multisessionstring=="") { multisessionstring="Unknown"; } msinfotmp.close(); system("rm msinfo.tmp"); ... Dat begrijp ik allemaal wel maar dat bovenstaande begrijp ik niet. Ik ben geen professioneel programmeur of zo, maar ik heb gewoon een tekstueel frontendje in elkaar geknutseld met ncurses onder linux voor cdrecord, omdat alle frontends die op internet te vinden zijn het niet doen bij mij.
Link naar reactie
[quote:c8f1c20deb="computerbacterie"][color=red:c8f1c20deb][b:c8f1c20deb]Daar begrijp ik helemaal niets van[/b:c8f1c20deb][/color:c8f1c20deb]. ... Dat begrijp ik allemaal wel maar [color=red:c8f1c20deb][b:c8f1c20deb]dat bovenstaande begrijp ik niet[/b:c8f1c20deb][/color:c8f1c20deb]. Ik ben geen professioneel programmeur of zo, maar ik heb gewoon een tekstueel frontendje in elkaar geknutseld met [color=red:c8f1c20deb][b:c8f1c20deb]ncurses onder linux[/b:c8f1c20deb][/color:c8f1c20deb] voor cdrecord, omdat alle frontends die op internet te vinden zijn het niet doen bij mij.[/quote:c8f1c20deb] Hmm, dat was specifieke Win32 code. Blijkbaar ben je onder Linux ofzo bezig?
Link naar reactie
[quote:45bb9c8ba2="h4xX0r"] Hmm, dat was specifieke Win32 code. Blijkbaar ben je onder Linux ofzo bezig?[/quote:45bb9c8ba2] Ik programmeer onder linux, inderdaad, en dan maak ik af en toe een commandline-programma. Van het programmeren van een grafische interface heb ik voor de rest geen verstand want ik gebruik de commandline, en dan de ncurses-bibliotheek voor de interface. Overigens gebruik ik ook geen IDE, maar ik programmeer alles vanuit een gewone teksteditor, en dan haal ik de compiler er over heen (g++ in dit geval).
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...