Vraag & Antwoord

Programmeren

c++: pipes

Anoniem
computerbacterie
6 antwoorden
  • 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.
  • Ik snap je vraag niet. Zoals je zelf zegt kan dat op de command-line. Dus lijkt me dat je probleem is opgelost :) Het maakt voor de command-line echt niet uit of de applicatie is geschreven als een script, in pascal of wat dan ook.
  • 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.
  • [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]

    Op basis van deze posting... 8)
    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.
  • 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.
  • [quote:c8f1c20deb="computerbacterie"]

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.