我成功地使用_popen打开管道,即gnuplot窗口。但无法使用fprintf写入流。我检查了文件指针值,它不是null。我搜索了很多资源并使用了fflush,但它不起作用。我找不到解决方案。fprintf不写入管道
其实我在这里问了一个类似的问题,在这里gnuplot c++ interface through pipes -cannot open wgnuplot重新发布了一些修改。
任何建议将是有益的..
FILE* gp;
string command = "set style data lines\n" ;
char *path = "\"C:\\Program Files\\gnuplot\\bin\\wgnuplot\" -persist";
gp = _popen(path , "wt");
if (gp == NULL)
return -1;
fprintf(gp,command);
fflush(gp);
_pclose(gp);
我用这个代码,而无需使用管道和它使用的CreateProcess。这里也是相同的情况,gnuplot.exe打开但没有输出图。
int _tmain (int argc, LPTSTR argv [])
{
DWORD i;
HANDLE hReadPipe, hWritePipe;
SECURITY_ATTRIBUTES PipeSA = {sizeof (SECURITY_ATTRIBUTES), NULL, TRUE};
/* Init for inheritable handles. */
TCHAR outBuf[ ] = TEXT("a=2; plot sin(a*x)/x; pause mouse; plot exp(-a*x); pause mouse") ;
TCHAR inBuf[80];
DWORD dwWritten, dwRead ;
BOOL bSuccess = FALSE;
PROCESS_INFORMATION ProcInfo2;
STARTUPINFO StartInfoCh2;
/* Startup info for the Gnuplot process. */
GetStartupInfo (&StartInfoCh2);
/* Create an anonymous pipe with default size.
The handles are inheritable. */
bSuccess = CreatePipe (&hReadPipe, &hWritePipe, &PipeSA, 0);
if (bSuccess == TRUE) printf("pipe created\n");
WriteFile(hWritePipe, outBuf, sizeof(outBuf), &dwWritten, NULL) ;
printf("Wrote %d bytes to Gnuplot\n", dwWritten) ;
CloseHandle (hWritePipe);
/* Repeat (symmetrically) for the child process. */
StartInfoCh2.hStdInput = hReadPipe;
StartInfoCh2.hStdError = GetStdHandle (STD_ERROR_HANDLE);
StartInfoCh2.hStdOutput = GetStdHandle (STD_OUTPUT_HANDLE);
StartInfoCh2.dwFlags = STARTF_USESTDHANDLES;
bSuccess = FALSE ;
bSuccess = CreateProcess ("C:\\Program Files\\gnuplot\\bin\\wgnuplot.exe", NULL, NULL, NULL,
TRUE,0, NULL, NULL, &StartInfoCh2, &ProcInfo2);
if (bSuccess == TRUE)
printf("Created Gnuplot Process\n") ;
WaitForSingleObject (ProcInfo2.hProcess, INFINITE);
CloseHandle (ProcInfo2.hThread);
CloseHandle (hReadPipe);
/* Wait for Gnuplot process to complete.*/
CloseHandle (ProcInfo2.hProcess);
return 0;
}
这可能有助于调试检查'fprintf'的返回值,如果该值为负,请使用'perror()' – keety 2012-04-11 04:51:27
为什么“wt”而不是“w”? – 2012-04-11 04:52:32
@VaughnCato我只是尝试不同的选项,因为在这个msdn文章[链接](http://msdn.microsoft.com/en-us/library/aa298534(v = vs.60).aspx) – ShivShambo 2012-04-11 05:10:37