Windows API,C ++:是否可以使用WriteFile创建用于将输出重定向到字符串的HANDLE的方法?

问题描述

我有const void*形式的Base64编码数据。当我使用WriteFile()函数将数据写入文件时,数据将以正确的格式写入。但是,当我尝试使用std::cout打印(直接打印或将其强制转换为char*后)时,格式是不同的/不需要的。因此,我更改了传递给HANDLE的{​​{1}},以将正确的输出打印到控制台,并且可以正常工作。

有什么办法可以保存/重定向字符串(或char数组)中的等效数据?我尝试搜索WriteFile(),以使用HANDLE输出写入字符串变量,但到目前为止仍未成功。这是代码

WriteFile()

WriteFile()函数

    void Write(const void* data,int size)
    {

        /* filePath is a local variable here */
        HANDLE mFile = CreateFileA(filePath,FILE_APPEND_DATA,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_norMAL,NULL);
        if ((mFile != NULL) && (size > 0))
        {
            std:: cout << data;                         // incorrect/undesired output
            char* stringData = (char *)data;
            std::cout << stringData;                    // incorrect/undesired output
            DWORD bytesWritten = 0;
            /* Writes output to the file */
            WriteFile(mFile,data,static_cast<DWORD>(size),&bytesWritten,NULL);

            /* Writes output to the console */
            HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
            WriteFile(hStdOut,NULL);

        }
    }

以下是所需的输出(以base64编码):

enter image description here

这是我们尝试使用BOOL WINAPI WriteFile( _In_ HANDLE hFile,_In_ LPCVOID lpBuffer,_In_ DWORD nNumberOfBytesToWrite,_Out_opt_ LPDWORD lpNumberOfBytesWritten,_Inout_opt_ LPOVERLAPPED lpOverlapped ); 直接打印数据时的输出(不正确/不需要)

enter image description here

解决方法

std:: cout << data;

打印由于data的类型为void*(或更确切地说为const void*)而传递的地址。

char* stringData = (char *)data;
std::cout << stringData;

要求数据写入NUL终止。

您可以使用write()函数将字节流放入std::basic_ostream(包括std::cout)中。

std::cout.write(reinterpret_cast<const char*>(data),size);