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 ---- 标准 ...
随机推荐
- [转帖]《Linux性能优化实战》笔记(八)—— 内存是怎么工作的
一. 内存映射 我们通常所说的内存容量,指的是物理内存.物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM).只有内核才可以直接访问物理内存.那么,进程要访问内存时,该怎么办呢? ...
- [转帖]logback:logback和slf4j中的:appender、logger、encoder、layout
(1)appender 1.appender标签是logback配置文件中重要的组件之一.在logback配置文件中使用appender标签进行定义.可 以包含0个或多个appender标签. 2.a ...
- [转帖]redis进程绑定指定的CPU核
文章系转载,便于分类和归纳,源文地址:https://blog.csdn.net/youlinhuanyan/article/details/99671878 1)查看某服务的pid $ ps -au ...
- [转帖]gcc与makefile常用操作(绝对常用,也绝对够用)
makefile与gcc常用操作 一.温故知新 1.可执行程序的生成过程 2.gcc的常用操作 二.make操作 三.编写Makefile文件时常用操作 注意:在Makefile文件中 空格和缩进是完 ...
- [转帖]iptables命令详解和举例(完整版)
1.防火墙概述 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底 ...
- 关于IO性能的一些学习与了解
关于IO性能的一些学习与了解 摘要 最近心气不高. 学习进度也拖的比较慢. 以后想能够多为自己着想.自己有自己的节奏, 不能只为别人考虑. 要改变一下自己的做事风格. 一些事情想帮则帮, 不想帮就当看 ...
- 【发现一个问题】macos m2 下无法使用 x86_64-linux-musl-gcc 链接含有 avx512 指令的 c 代码
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 一开始是使用 golang 中的 cgo 来编译: env ...
- MySQL知识点总结(完整版)
MySQL学习笔记 登录和退出MySQL服务器 # 登录MySQL $ mysql -u root -p12345612 # 退出MySQL数据库服务器 exit; 基本语法 -- 显示所有数据库 s ...
- Fabric区块链浏览器(1)
本文是区块链浏览器系列的第三篇,本文介绍区块链浏览器的主体部分,即区块数据的解析. 这一版本的区块链浏览器是基于gin实现的,只提供三种接口: /block/upload:POST,上传Protobu ...
- 【Mysql】复合主键和联合主键的区别
复合主键: create table index_test ( a int not null, b int not null, c int not null, d int null, primary ...