Win32调度程序并将stdout重定向到文件缓冲区问题?

时间:2010-12-20 21:29:22

标签: c winapi redirect console pipe

在Wi32上 我正在尝试启动一个可重定向到文件名(当前日期)的可执行文件,例如同样如下:

Someexecutable.exe> 20101220000000.txt

当我从windows cmd.exe执行此操作时,一切正常。但是当从我的程序执行此操作时,如下所示,系统似乎要么删除重定向,即使它创建文件和/或它似乎在刷新到磁盘之前缓冲大量数据。 我无法更改正在运行的可执行文件。 现在执行的程序只写入stdout,但请记住我根本无法改变它。 (最简单的方法就是做stdout = filehandle;但我现在对我来说这是不可能的!)

(不是必需的:程序也等同于system()这不是必需的,但是分离正在通过system()运行的程序的最简单方法是什么)

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

int main(int argc, char *argv[])
{
  char   execstr[512];
  char   s[30];
  size_t i;
  struct tm tim;
  time_t now;

  now = time(NULL);
  tim = *(localtime(&now));
  i   = strftime(s,30,"%Y%m%d%H%M",&tim);

  sprintf(execstr,"someexecutable.exe > %s.txt",s);
  printf("Executing: \"%s\"\n",execstr);

  system(execstr);
  exit(0);
  return 0;
}

2 个答案:

答案 0 :(得分:2)

我认为没有任何理由不起作用,但如果您遇到这种情况,则替代解决方案之一可能是使用popen然后从管道中读取以在所需文件中写入。这是一些在屏幕上打印的示例代码。您可以根据需要将其写入文件而不是屏幕/控制台。

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

int main(int argc, char *argv[])
{
  char   execstr[512];
  char   s[30];
  size_t i;
  struct tm tim;
  time_t now;
  char   buf[128];
  FILE   *pipe;

  now = time(NULL);
  tim = *(localtime(&now));
  i   = strftime(s,30,"%Y%m%d%H%M",&tim);

#if 0
  sprintf(execstr,"a.exe > %s.txt",s);
  printf("Executing: \"%s\"\n",execstr);
#endif /* #if 0 */

   if( (pipe = _popen("a.exe", "rt")) == NULL )
      exit( 1 );

   while(!feof(pipe))
   {
      if (fgets(buf, 128, pipe) != NULL )
         printf(buf);   /* write to the required file here */
   }

   _pclose(pipe);

  return 0;
}

答案 1 :(得分:0)

您的程序适合我(在VS 2010中测试)。如果在IDE中运行测试,可能会遇到的一些问题是:

  • 程序的当前目录可能不是您期望的那样(因此您可能在错误的位置查找输出文件)。默认情况下,在IDE中运行时程序的当前目录将是具有项目文件的目录(whatever.vcproj或其他,.vcxproj) - 而不是具有可执行文件的目录。这可以在项目设置中更改。
  • IDE的路径可能与您在标准命令行中获得的路径不同,因此您的程序可能找不到someexecutable.exe

如果您更改了程序,则sprintf()调用的行如下所示:

sprintf(execstr,"someexecutable.exe",s);

您是否在控制台窗口中看到someexecutable.exe的输出?