这里需要两个app.

parent.cpp

#include <Windows.h>
#include <stdio.h> int main()
{
SECURITY_ATTRIBUTES se = {};
se.nLength = sizeof(SECURITY_ATTRIBUTES);
se.bInheritHandle = true;
se.lpSecurityDescriptor = NULL;
HANDLE hFile = CreateFileW(L"test.txt", GENERIC_WRITE, FILE_SHARE_READ, &se, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
BOOL ret = SetStdHandle(STD_OUTPUT_HANDLE, hFile); printf("parent\n");
STARTUPINFO si = {};
si.cb = sizeof(STARTUPINFO);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi = {};
WCHAR cmd[] = L"child.exe"; CreateProcessW(cmd, NULL, 0, 0, 1, 0, 0, 0, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
system("pause");
}

child.cpp

#include <stdio.h>
#include <windows.h> int main()
{
DWORD lpMode;
DWORD dwCount;
HANDLE winout = GetStdHandle(STD_OUTPUT_HANDLE);
BOOL is_console = GetConsoleMode(winout, &lpMode);
int err = GetLastError();
if (is_console) {
printf("Line 1 to console using printf.\n");
WriteConsoleA(winout, "Line 2 to console using WriteConsoleA.\n", 39, &dwCount, NULL);
printf("Line 3 to console using printf.\n");
WriteConsoleA(winout, "Line 4 to console using WriteConsoleA.\n", 39, &dwCount, NULL);
printf("Line 5 to console using printf.\n");
WriteConsoleA(winout, "Line 6 to console using WriteConsoleA.\n", 39, &dwCount, NULL);
printf("Line 7 to console using printf.\n");
WriteConsoleA(winout, "Line 8 to console using WriteConsoleA.\n", 39, &dwCount, NULL);
}
else {
printf("Line 1 to file using printf.\n");
fflush(stdout);
WriteFile(winout, "Line 2 to file using WriteFile.\n", 32, &dwCount, NULL);
printf("Line 3 to file using printf.\n");
fflush(stdout);
WriteFile(winout, "Line 4 to file using WriteFile.\n", 32, &dwCount, NULL);
printf("Line 5 to file using printf.\n");
fflush(stdout);
WriteFile(winout, "Line 6 to file using WriteFile.\n", 32, &dwCount, NULL);
printf("Line 7 to file using printf.\n");
fflush(stdout);
WriteFile(winout, "Line 8 to file using WriteFile.\n", 32, &dwCount, NULL);
}
return 0;
}

如果控制台句柄被定向,GetConsoleMode函数将会返回0,并得到err 6的错误信息,代表无效句柄。

并且如果将WriteConsole与重定向到文件的标准句柄一起使用,则会失败。

参考:WriteConsole

所以我们需要使用WriteFile来输出,需要注意,如果没有fflush(),会输出

Line 2 to file using WriteFile.
Line 4 to file using WriteFile.
Line 6 to file using WriteFile.
Line 8 to file using WriteFile.
Line 1 to file using printf.
Line 3 to file using printf.
Line 5 to file using printf.
Line 7 to file using printf.

会发现WriteFile先全部打印完,printf才开始打印。

因为当我们重定向到文件时,输出流将被会被完全缓冲,除非使用fflush(),否则将不会刷新该流,除非我们向其写入大量数据。

参考: Why does stdout need explicit flushing when redirected to file?

win32 - 将控制台输出重定向到txt文本上的更多相关文章

  1. 将Java和Javac的命令在控制台的输出重定向到txt文件

    当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...

  2. Java代码工具箱之控制台输出重定向_控制台输出到文件

    1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...

  3. 在使用hibernate的getHibernateTemplate()时怎么让控制台输出封装好的SQL? 怎么用日志打印出来?

    我们在使用 Hibernate 时一般只会关注是否显示生成的 SQL 语句,不过有些时候还不够.默认时 Hibernate 执行的 SQL 语句是打印在控制台上的,它也可以配置为输出给 Log4J 或 ...

  4. 控制台输出到txt

    //PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. //PrintStream不同于PrintWriter,PrintStream输出的是字节内容. //pu ...

  5. IDEA控制台打印程序内汉字乱码及txt文本乱码

    控制台打印汉字乱码 解决IntelliJ IDEA控制台输出中文乱码问题 txt文本乱码 解决IDEA读取txt文本中显示的中文乱码问题

  6. 重定向、feed输出:控制台输出的内容存放到文件

    重定向.feed输出:控制台输出的内容存放到文件 1.重定向 os.system('wget -r -p -np -k http://www.baidu.com/ -o wget.log' ) 2.f ...

  7. android 输出.txt 文本换行问题

    // 获取当前日期和时间 Calendar cal = Calendar.getInstance(); String fileName = cal.get(Calendar.YEAR) + " ...

  8. linux | 管道符、输出重定向

    1 输出重定向 ll > a.txt 将 ll的结果写入到a.txt 2 管道符 ls -la | grep h* 这条命令的理解为:ls -la 的结果作为gerp h* 的结果 gerp 是 ...

  9. bat输出重定向

    重定向符号主要有:>,>>,<,>&,<&和|,而本文只讨论前五个. 第一节 首先从一个经典问题开始,“1>nul 2>nul”的意思是 ...

  10. unix下输出重定向

    > 为重定向符号 >> 重定向不覆盖原文件内容 example: 1. 标准输出重定向 echo "123" > /home/123.txt ---- 标准 ...

随机推荐

  1. [转帖]使用 Grafana 监控 TiDB 的最佳实践

    https://docs.pingcap.com/zh/tidb/stable/grafana-monitor-best-practices 使用 TiUP 部署 TiDB 集群时,如果在拓扑配置中添 ...

  2. [转帖]2.2.1 Lightning 工作原理

    https://book.tidb.io/session2/chapter2/lightning-internal.html TiDB Lightning 工具支持高速导入 Mydumper 和 CS ...

  3. [转帖]探索惊群 ⑥ - nginx - reuseport

    https://wenfh2020.com/2021/10/12/thundering-herd-tcp-reuseport/   SO_REUSEPORT (reuseport) 是网络的一个选项设 ...

  4. 【转帖】Linux查看二进制文件:一招制敌(linux二进制查看文件)

    https://www.dbs724.com/146055.html 一招制敌:学会Linux查看二进制文件 在Linux操作系统中,二进制文件是一种常见的文件类型.如果你想深入了解一个二进制文件,可 ...

  5. 【转帖】通过pip命令安装好包之后,在pycharm中不显示此库,也不能调用

    目录 1. 问题描述 2. 解决方法1 3. 解决方法2 1. 问题描述 在cmd输入pip list 命令可以看到我的库都已经安装好了,但是pycharm中却没有显示. 在PyCharm查找,并没有 ...

  6. [转帖]Java 内存管理

    https://www.cnblogs.com/xiaojiesir/p/15590092.html   Java 内存模型简称 JMM,全名 Java Memory Model .Java 内存模型 ...

  7. 【OpenAI】ChatGPT函数调用(Function Calling)实践

    6月13日OpenAI在Chat Completions API中添加了新的函数调用(Function Calling)能力,帮助开发者通过API方式实现类似于ChatGPT插件的数据交互能力. 本文 ...

  8. DotLiquid(.net模版引擎)

    可用生成C#代码,在KSFramework中有使用:https://github.com/mr-kelly/KSFramework 主页:http://dotliquidmarkup.org/ 文档: ...

  9. 基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回

    基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回 语义索引(可通俗理解为向量索引)技术是搜索引擎.推荐系统.广告系统在召回阶段的核心技术之一.语义索引模型的 ...

  10. 【二】MADDPG多智能体算法实现(parl)【追逐游戏复现】

    相关文章: [一]MADDPG-单智能体|多智能体总结(理论.算法) [二]MADDPG多智能体深度强化学习算法算法实现(parl)--[追逐游戏复现] 程序链接:直接fork:MADDPG多智能体深 ...