Win32 диспетчерская программа и перенаправить стандартный вывод в файл буфера проблема? - PullRequest
1 голос
/ 21 декабря 2010

по Wi32 Я пытаюсь запустить исполняемый файл, который перенаправляет на имя файла (текущая дата), например. так же, как:

Someexecutable.exe> ​​20101220000000.txt

Когда я делаю это из windows cmd.exe, все работает нормально. Однако, когда я делаю это из моей программы, как показано ниже, система, похоже, не сбрасывает перенаправление, даже если создает файл и / или кажется, что буферизует большой объем данных перед записью на диск. Я не могу изменить исполняемый файл, который запускается. Выполняемая программа теперь только записывает в стандартный вывод, но помните, что я не могу изменить это вообще. (Самый простой способ - это просто сделать 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 ]

2 голосов
/ 01 января 2011

Я не вижу причин для того, чтобы это не работало, но если это так с вами, одним из альтернативных решений может быть использование 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;
}
0 голосов
/ 21 декабря 2010

Ваша программа отлично работает для меня (тестирование в VS 2010). Некоторые проблемы, с которыми вы можете столкнуться, если выполняете свои тесты в IDE:

  • текущий каталог для программы может не соответствовать ожидаемому (поэтому вы можете искать выходной файл не в том месте). По умолчанию текущим каталогом программы при запуске в IDE будет каталог, в котором находится файл проекта (независимо от .vcproj или без .vcxproj), а не каталог с исполняемым файлом. Это можно изменить в настройках проекта.
  • путь IDE может не совпадать с тем, который вы получаете в стандартной командной строке, поэтому ваша программа может не найти someexecutable.exe

Если вы измените свою программу так, чтобы строка с вызовом sprintf() выглядела так:

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

Видите ли вы вывод someexecutable.exe в окне консоли?

...