C++之重定向stdout到内存

这篇具有很好参考价值的文章主要介绍了C++之重定向stdout到内存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

重定向到文件比较简单

freopen("text_file.txt", "w", stdout);

重定向到内存稍微复杂一点,需要借助管道,关于管道的介绍,详见:windows命名管道

#include <thread>
#include <atomic>
#include <iostream>
#include <string>
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include <fcntl.h>

#include <QDebug>

bool RedirectStdout(HANDLE &hReadPipe, HANDLE hWritePipe)
{
    if (!::CreatePipe(&hReadPipe, &hWritePipe, 0, 0))
    {
        return false;
    }
    int hCrt = ::_open_osfhandle((intptr_t)hWritePipe, _O_TEXT);
    FILE *hFile = ::fdopen(hCrt, "w");
    *stdout = *hFile;
    int ret = ::setvbuf(stdout, NULL, _IONBF, 0);
    if (ret != 0)
    {
        return false;
    }
    return true;
}

std::atomic_bool runFlag(true);

int main(int argc, char *argv[])
{
    HANDLE hReadPipe = INVALID_HANDLE_VALUE;
    HANDLE hWritePipe = INVALID_HANDLE_VALUE;
    bool ret = RedirectStdout(hReadPipe, hWritePipe);
    if (ret)
    {
        std::thread th([&]{
            const int bufferSize = 4096;
            char buffer[bufferSize];
            unsigned long readLength = 0;
            std::string output;
            while (runFlag)
            {
                memset(buffer, 0, bufferSize);
                if (!::ReadFile(hReadPipe, buffer, bufferSize, &readLength, NULL) || !readLength)
                {
                    runFlag = false;
                    break;
                }

                output.append(std::string(buffer, readLength);
                std::string::size_type index = output.find("\r\n");
                while (index != std::string::npos)
                {
                    std::string log = output.substr(0, index) + "\r\n";
                    // TODO:将log添加到文本框中,会显示:
                    // CSDN
                    // 草上爬
                    // https://blog.csdn.net/caoshangpa
                    output = output.substr(index +2);
                    index = output.find("\r\n");
                }

                ::CloseHandle(hReadPipe);
            }
        });

        std::thread th2 = std::move(th);
        std::cout << "CSDN" << std::endl;
        std::cout << "草上爬" << std::endl;
        std::cout << "https://blog.csdn.net/caoshangpa" << std::endl;

        Sleep(10000);

        runFlag = false;
        if (hWritePipe != INVALID_HANDLE_VALUE)
        {
            ::CloseHandle(hWritePipe);
        }
        if (th2.joinable())
        {
            th2.join();
        }
        // 重定向回终端
        freopen("CON", "w", stdout);
        std::cout << "Finished" << std::endl;
    }
    return 0;
}

需要注意的是,此处ReadFile为阻塞模式,管道中无数据时会阻塞等待,关闭hWritePipe会解除ReadFile的阻塞状态,这样线程就能正常退出了。

原文链接:C++之重定向stdout到内存-CSDN博客文章来源地址https://www.toymoban.com/news/detail-719327.html

到了这里,关于C++之重定向stdout到内存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Bash将输出同时重定向到标准输出stdout和文件

    本文参考How to redirect output to a file and stdout。 对于任意原本默认输出到标准输出 stdout 的程序或命令 foo ,只需执行 即可同时输出到 output.file 文件。 例如,若想输出当前目录下的所有目录与文件到标准输出 stdout 的同时保存到 output.file 文件,执行 如果同时想输出程序或命令的

    2024年04月14日
    浏览(33)
  • C++ freopen函数用法详解

    在OI里赛制中 如果没有文件操作或文件操作被注释,等待着你的就是 爆零 的命运。C和C++的文件操作,一般是用fopen或fstream,我们用 freopen ,即文件重定向。它的用法其实也挺简单。 参数: _Filename :要打开的文件名。 _Mode :打开方式,同fopen。 _File :一个FILE型指针,可以

    2024年02月06日
    浏览(45)
  • nginx重定向问题解决(rewrite or internal redirection cycle)

    访问日志文件 nginx.conf配置文件内容 根据提供的访问日志和nginx.conf配置文件分析,是循环重定向的问题。 配置中,location / 块使用了 try_files $uri $uri/ /index.html; 会导致导致在尝试访问根目录时发生重定向循环。 修改:添加一个新的 location=/index 块,直接提供 /index.html 而不进行

    2024年02月05日
    浏览(56)
  • 解决爬虫在重定向(Redirect)情况下,URL没有变化的方法

        重定向是一种网络服务,它可以实现从一个网页跳转到另一个网页的功能。它把用户请求的网页重定向到一个新的位置,而这个位置可以是更新的网页,或最初请求的网页的不同版本。另外,它还可以用来改变用户流量,当用户请求某个网页后,它会将用户请求重定向

    2024年02月05日
    浏览(61)
  • 【看表情包学Linux】文件描述符 | 重定向 Redirection | dup2 函数 | 缓冲区的理解 (Cache)

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 在上一章中,我们已经把 fd 的基本原理搞清楚了。本章我们将开始探索 fd 的应用特征,探索 文件描述符的分配原则。讲解重定向,上一章是如何使用 fflush 把内容变出来的,介绍 dup2 函数,

    2023年04月25日
    浏览(40)
  • 【Linux】Linux的管道与重定向

    🍎 个人博客: 个人主页 🏆 个人专栏: Linux ⛳️   功不唐捐,玉汝于成 目录 前言 正文 管道(Pipe): 语法: 工作原理: 示例: 重定向(Redirection): 输入重定向: 输出重定向: 示例: 组合使用: 结语  我的其他博客 在Linux系统中,管道和重定向是使命令行操作更为

    2024年03月20日
    浏览(36)
  • Shell编程 管道和重定向 | 基本概念及其相关应用

    在Linux中,管道和重定向是非常有用的工具,用于处理命令的输入和输出。它们允许你将多个命令组合在一起,将命令的输出发送到文件或从文件中读取输入。以下是有关Linux管道和重定向的详细介绍,并附带了丰富的示例: 管道符号 | 用于将一个命令的输出传递给另一个命

    2024年01月18日
    浏览(33)
  • linux中好玩的数据流定向和管道命令一

    知识点复习: 什么是数据流定向,个人理解就是将 一些结果信息不打印在屏幕上,而是定位在某一个文件里面 ll /wdf file  会覆盖file的原内容 ll /wdf 会追加到原文件后面 比如在自己的目录新建1.TXT, 2.txt ll /home/wdf list cat list 然后增加3.txt ll /home/wdf list cat list  #此时会显示3个

    2024年02月08日
    浏览(29)
  • 【C语言练习】C语言如何操作内存(重中之重!!!)

    📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉 📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处 以下面的代码为例

    2024年02月09日
    浏览(29)
  • Linux echo命令与反引号、重定向符号以及管道符

    echo命令 Linux中的 echo 命令用于在终端输出指定的文本内容或变量值。 基本语法如下: 常用选项包括: -e :启用特殊字符的解析,例如 n 表示换行符。 -n :禁止在输出末尾添加换行符。 示例: 输出文本内容: 输出结果: 输出变量值: 输出结果: 解析特殊字符: 输出结果

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包