• 输入输出重定向


    本文解释如何重新从 C 程序, 定向到文件 stdout 再恢复原始 stdout 同一程序中稍后。 C 函数通常用于重定向 stdout 或 stdin 是 freopen()。 将 stdout 重定向到文件称为 FILE.TXT, 使用以下调用:
       freopen( "file.txt", "w", stdout );
    该语句导致所有后续输出, 向 stdout, 它通常定向到转到 FILE.TXT 文件。

    要返回到显示 (默认 stdout), stdout 使用以下调用:
       freopen( "CON", "w", stdout );
    在两个情况, 检查返回值是 freopen() 以确保重定向到实际发生。

    下面是一个短程序来演示是 stdout 重定向:


    #include <stdio.h>
    #include 
    <stdlib.h>

    void main(void)
    {
       FILE 
    *stream ;
       
    if((stream = freopen("file.txt""w", stdout)) == NULL)
          exit(
    -1);

       printf(
    "this is stdout output\n");

       stream 
    = freopen("CON""w", stdout);

       printf(
    "And now back to the console once again\n");
    }

    BOOL   CDnsTestDlg::My_System(
    char *cmd,CString& m_strOutPut)   
    {   
        SECURITY_ATTRIBUTES   lsa;   
        STARTUPINFO   si;   
        PROCESS_INFORMATION   pi,   
    *lppi;   
        HANDLE   hReadPipe,   hWritePipe;   
        
        lsa.nLength   
    =   sizeof(SECURITY_ATTRIBUTES);   
        lsa.lpSecurityDescriptor   
    =   NULL;   
        lsa.bInheritHandle   
    =   TRUE;   
        
        lppi   
    =   &pi;   
        CWaitCursor   waitCursor;   
        
        
    if(!CreatePipe(&hReadPipe,   &hWritePipe,   &lsa,   0))   {   
            AfxMessageBox(
    "Error   on   create   pipe.");   
            
    return   FALSE;   
        }   
        
        memset(
    &si,   0,   sizeof(STARTUPINFO));   
        si.cb   
    =   sizeof(STARTUPINFO);   
        si.dwFlags   
    =   STARTF_USESTDHANDLES   |   STARTF_USESHOWWINDOW;   
        si.wShowWindow   
    =   SW_HIDE;   
        si.hStdOutput   
    =   hWritePipe;   
        
        
    if(!CreateProcess(NULL,   cmd,   NULL,   NULL,   TRUE,   0,   NULL,   NULL,   &si,   &pi))   {   
            AfxMessageBox(
    "Error   on   create   process");   
            
    return   FALSE;   
        }   
        DWORD   cchReadBuffer;   
        CString   strText;   
        TCHAR   ph[
    5000];   
        
        m_strOutPut.Empty();   
        
        
    for(;;)   {   
            cchReadBuffer   
    =   0;   
            
    if(!PeekNamedPipe(hReadPipe,   ph,   1,   &cchReadBuffer,   NULL,   NULL))   break;   
            
            
    if(cchReadBuffer)   {   
                
    if(!ReadFile(hReadPipe,   ph,   4096,   &cchReadBuffer,   NULL))   break;   
                ph[cchReadBuffer]   
    =   0;   
                m_strOutPut   
    +=   ph;;   
            }   
            
    else   
                
    if(WaitForSingleObject(pi.hProcess,   0)   ==   WAIT_OBJECT_0)   break;   
                Sleep(
    500);   
        }   
        
        ph[cchReadBuffer]   
    =   0;   
        m_strOutPut   
    +=   ph;   
        
        CloseHandle(hReadPipe);   
        CloseHandle(pi.hThread);   
        CloseHandle(pi.hProcess);   
        CloseHandle(hWritePipe);     
        
    return   TRUE;   
    }   
  • 相关阅读:
    5种排序算法
    Numpy 基础
    Git 帮助
    SpringBoot巧用 @Async 提升API接口并发能力
    延时队列实现的方式总结
    Spring Boot 进行优雅的字段校验
    分布式搜索引擎Elasticsearch的架构分析
    Redis 使用规范
    Intellij IDEA远程debug线上项目记录
    领域驱动设计:领域接口化设计
  • 原文地址:https://www.cnblogs.com/ahuo/p/879797.html
Copyright © 2020-2023  润新知