none
读取控制台输出 RRS feed

  • 问题

  •     在一个Console Application中, 如何读取CMD的标准输出并保存到文件.

       根据MSDN方法, 可以调用ReadConsoleOutputCharacter与ReadConsoleOutput. 但调用ReadConsoleOutput后可以获取正常的数据,但对数据解析时比较麻烦. 而使用ReadConsoleOutputCharacter时, 当传递谋取长度<80时显示正常, >=80(CMD的宽度为80字符)时可能存在覆盖缓冲区已读取字条问题, ReadConsoleOutputCharacter在调用读取一行时比较适合(当参数<80时).

      请问:

        1. 如果调用ReadConsoleOutputCharacter的参数, 才能正确地读取一行完整的数据.

        2. 在多线程的环境下, 如何读取每个线程的输出, 现在的情况是读取整个控制台的输出(线程可能存在乱序输出的问题).


    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    2010年7月6日 2:16

全部回复

  • 你可以参考我的一篇文章:

    http://blog.csdn.net/Vonger/archive/2010/04/06/5453711.aspx

    我是用管道获取的标准输入输出。

     

    ReadConsoleOutputCharacter这个函数在MSDN上有详细说明,请参考:

    http://msdn.microsoft.com/en-us/library/ms684969(VS.85).aspx


    0xBAADF00D
    2010年7月6日 15:22
    版主
  • 你的博客我看了, 是通过管道来获取的, 我以前也实现过. 但涉及到创建子进程,可能不适合我.

    另外 ReadConsoleOutputCharacter这个函数也在MSDN中看过, 当传递参数>=80后虽然能读取到数据, 但都会覆盖前面已读取的内容.

     


    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    2010年7月7日 1:21
  • 我不太了解你的情况,我猜测可变长缓冲可以解决你的问题。

    就是一次先读取少一些的字节,比如40个,然后把它用memcpy复制到一个大的缓冲中,循环直到填满大缓冲。


    0xBAADF00D
    2010年7月7日 8:36
    版主
  • 可是为什么在一个较大的缓冲区(1024 * 60)呀, 读取79个字符就正常, 读取80个字符就出现问题了呢.

    msdn中不是说当设置读取长度较大时读完第一行后会继续读取下一行. 直到结尾为止.


    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    2010年7月8日 1:01
  • 你的博客我看了, 是通过管道来获取的, 我以前也实现过. 但涉及到创建子进程,可能不适合我.

    另外 ReadConsoleOutputCharacter这个函数也在MSDN中看过, 当传递参数>=80后虽然能读取到数据, 但都会覆盖前面已读取的内容.

     


    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    管道是比较通用的一种方法。
    2010年7月12日 12:35
    版主
  • 管道是常用. 但也得看场合, 而且管道需要创建进程.

    我的问题不是问管道, 而是问ReadConsoleOutputCharacter这个API的正确使用方法


    高手,是用孤独和寂寞堆砌而成的.这过程,没有任何精彩和快乐可言.自己的选择,自己承载....
    2010年7月13日 7:16