win32 - 将控制台输出重定向到txt文本上
这里需要两个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文本上的更多相关文章
- 将Java和Javac的命令在控制台的输出重定向到txt文件
当我们在Windows控制台窗口执行程序时,输入如下命令: demo.exe > out.txt 就可以把demo程序的输出重定向到out.txt文件里面. 但是这种方法对于java和javac ...
- Java代码工具箱之控制台输出重定向_控制台输出到文件
1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. //自定导入必要库 //然 ...
- 在使用hibernate的getHibernateTemplate()时怎么让控制台输出封装好的SQL? 怎么用日志打印出来?
我们在使用 Hibernate 时一般只会关注是否显示生成的 SQL 语句,不过有些时候还不够.默认时 Hibernate 执行的 SQL 语句是打印在控制台上的,它也可以配置为输出给 Log4J 或 ...
- 控制台输出到txt
//PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. //PrintStream不同于PrintWriter,PrintStream输出的是字节内容. //pu ...
- IDEA控制台打印程序内汉字乱码及txt文本乱码
控制台打印汉字乱码 解决IntelliJ IDEA控制台输出中文乱码问题 txt文本乱码 解决IDEA读取txt文本中显示的中文乱码问题
- 重定向、feed输出:控制台输出的内容存放到文件
重定向.feed输出:控制台输出的内容存放到文件 1.重定向 os.system('wget -r -p -np -k http://www.baidu.com/ -o wget.log' ) 2.f ...
- android 输出.txt 文本换行问题
// 获取当前日期和时间 Calendar cal = Calendar.getInstance(); String fileName = cal.get(Calendar.YEAR) + " ...
- linux | 管道符、输出重定向
1 输出重定向 ll > a.txt 将 ll的结果写入到a.txt 2 管道符 ls -la | grep h* 这条命令的理解为:ls -la 的结果作为gerp h* 的结果 gerp 是 ...
- bat输出重定向
重定向符号主要有:>,>>,<,>&,<&和|,而本文只讨论前五个. 第一节 首先从一个经典问题开始,“1>nul 2>nul”的意思是 ...
- unix下输出重定向
> 为重定向符号 >> 重定向不覆盖原文件内容 example: 1. 标准输出重定向 echo "123" > /home/123.txt ---- 标准 ...
随机推荐
- [转帖]一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
https://tidb.net/blog/0c5b6025 1.1. 字符集与编码规则 字符集(character set)即为众多字符的集合.字符集为每个字符分配一个唯一的 ID,称为 &qu ...
- 【转帖】《MySQL高级篇》四、索引的存储结构
1. 为什么使用索引 假如给数据使用 二叉树 这样的数据结构进行存储,如下图所示 2.索引及其优缺点 2.1 索引概述 2.2 优点 类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的 IO ...
- [转帖]大模型训练,英伟达Turing、Ampere和Hopper算力分析
https://www.eet-china.com/mp/a219195.html 大 GPU 优势在于通过并行计算实现大量重复性计算.GPGPU即通用GPU,能够帮助 CPU 进行非图形相关程序的运 ...
- Rsync原理的学习与总结
Rsync原理的简单学习 前言 工作这么多年, 感觉对自己帮助最大的是rsync. 用了很多rsync的脚本, 甚至因为这个脚本授权了两个专利. 但是昨天晚上在跟高手聊天时发现 自己对rsync 其实 ...
- [转帖]关于Nacos默认token.secret.key及server.identity风险说明及解决方案公告
https://nacos.io/zh-cn/blog/announcement-token-secret-key.html 近期Nacos社区收到关于Nacos鉴权功能通过token.secret. ...
- [转帖]linux时间戳转换成时间指令_时间戳转换公式
原文地址:http://wanping.blogbus.com/logs/28663569.html 1.时间戳转换为正常显示的时间格式 Freebsd 系统下: 转换命令为: date -r 111 ...
- 如何通过gRPC传输文件
在gRPC中,可以通过将文件分割成多个小块,然后使用流式RPC将这些小块发送到服务器来传输文件.以下是一个简单的示例,展示了如何在gRPC中实现文件传输. 首先,我们需要定义一个服务来处理文件传输.在 ...
- TienChin 活动管理-活动状态完善
修改字典 修改活动状态字典,将之前的数据键值为 0 的数据标签内容改为 过期: 更改下数据库的描述,禁用改为过期: ALTER TABLE `tienchin_activity` MODIFY COL ...
- 大语言模型的预训练[1]:基本概念原理、神经网络的语言模型、Transformer模型原理详解、Bert模型原理介绍
大语言模型的预训练[1]:基本概念原理.神经网络的语言模型.Transformer模型原理详解.Bert模型原理介绍 1.大语言模型的预训练 1.LLM预训练的基本概念 预训练属于迁移学习的范畴.现有 ...
- 【四】-强化学习入门简介---PaddlePaddlle强化学习及PARL框架
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...