【问题标题】:Combining batch and C++ [duplicate]结合批处理和C++ [重复]
【发布时间】:2015-07-27 22:56:45
【问题描述】:

我在批处理脚本方面非常流利,但我的 c++ 知识并不那么强。我想知道如何创建一个 c++ 程序:

  1. 包含用户可以输入文本的输入字段
  2. c++ 程序调用批处理文件并将信息输入批处理文件
  3. 批处理文件处理此输入,然后将输出反馈到 c++ 程序中
  4. c++ 程序在屏幕上显示此输出。

请不要说这完全在 BATCH 和 C++ 之间,并且与之前提出的问题不重复。 提前致谢。

【问题讨论】:

  • 如果您在问题中交换 C++batch,它会更有意义...

标签: c++ windows batch-file


【解决方案1】:

为了拥有一个文本字段,您需要一个 GUI。 GUI 不是 C++ 的固有部分,因此您必须使用一些 GUI 框架,例如 Qt。从理论上讲,您只能使用 WinAPI 来完成,但我想这会很痛苦。在我的示例中,我从控制台获取输入数字。

关于调用批处理和传递参数,很简单。只需调用进程cmd.exe /C {yourbatch}.bat {parameters}。请注意,您可以将输入数据作为命令行参数传递给批处理(也可以使用环境变量)。为了启动exe-file,你可以使用WinAPI的CreateProcess函数(我从this answer中抽取了样本)

获得输出有点困难。其中一种方法是使用管道捕获批处理的控制台输出流。 this 之类的东西...但是,简单地使用文件来传递任何数据要容易得多。

C++ 示例

#include <stdio.h>
#include <windows.h>

int main() {
    int n;
    scanf("%d", &n);                            //read integer n from console

    int *arr = new int[n];                      //create array of 1..n integers
    for (int i = 0; i < n; i++)
        arr[i] = i + 1;

    char cmd[1024] = "cmd.exe /C script.bat";   //base command line
    for (int i = 0; i < n; i++)                 //add array elements as console parameters
        sprintf(cmd, "%s %d", cmd, i);

    STARTUPINFO info = {sizeof(info)};          //create cmd.exe process
    PROCESS_INFORMATION processInfo;
    if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) {
        WaitForSingleObject(processInfo.hProcess, INFINITE);
        CloseHandle(processInfo.hProcess);      //note that we wait for completition
        CloseHandle(processInfo.hThread);
    }

    int sum;
    FILE *f = fopen("sum.txt", "r");            //read sum from 'sum.txt'
    fscanf(f, "%d", &sum);
    fclose(f);

    printf("Sum of 1..%d is %d\n", n, sum);     //print the sum
    return 0;
}

Sample Batch(必须在工作目录中命名为script.bat):

del sum.txt
set sum=0
for %%x in (%*) do (                            //sum all the parameters
    set /A sum+=%%~x
)
echo %sum% >sum.txt                             //write result to sum.txt

【讨论】:

  • 对不起,那是 C 代码,不是 C++
  • @Cyber​​Spock 它在 C++ 中完美运行。用std::vector&lt;int&gt; 替换int* 并没有让这块**** 变得更好=)
  • 它仍然是 C 代码 IOW:C++ 程序员不会这样写,C 程序员会。
  • 将 WinAPI 与 STL 混合对我来说似乎很奇怪。或许boost中有进程创建例程,但是你真的要请C++新手使用boost吗?
  • 将 STL 与 WinApi 一起使用效果很好,例如'std::vector cmd(1024); .. Createprocess(nullptr, &cmd[0],... )' 不知道你为什么提到 boost? iostream 提供类型安全和方便等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2017-12-22
  • 2018-04-02
  • 2021-04-03
  • 2011-05-18
  • 1970-01-01
相关资源
最近更新 更多