无法使用WriteConsoleOutputCharacter将文本文件的内容输出到控制台

时间:2018-02-06 16:17:32

标签: c++ arrays string winapi console

我希望此代码将file.txt(两行 Lorem Ipsum ,113个字符)的内容输出到控制台。

#include <Windows.h>

void LoadFile(const char *filename="file.txt")
{
    FILE *stream;
    fopen_s(&stream, filename, "r+t");
    int size = 113;
    // filesize
    wchar_t *screen = new wchar_t[size];
    // I'm using wchar_t because WriteConsoleOutputCharacter needs an LPCWSTR

    fread(screen, sizeof(char), size, stream);

    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD dwBytesWritten = 0;
    WriteConsoleOutputCharacter(hConsole, screen, size, { 0, 0 }, &dwBytesWritten);
    fclose(stream);
}

代码确实编译,但实际输出只是一串正方形:

Little squares

我的理解是fread()将读取stream的内容并将其复制到缓冲区screen中。我尝试将sizeof(char)更改为sizeof(wchar_t)并打开一个100%宽字符的文件(只是一个113 ж的字符串,所以226字节)但得到了相同的结果

我还尝试使用_wfopen_s代替fopen_s

1 个答案:

答案 0 :(得分:0)

你的问题在于:

fread(screen, sizeof(char), size, stream);

问题在于你告诉fread假设每个单元格长度为sizeof(char)个字节,即1个字节,然后你告诉它读取大小的“大小”。单元格,表示您正在读取113个字节。

问题是您正在尝试将ANSI字符读入宽字符数组。 另外,您的来电:

  WriteConsoleOutputCharacter(hConsole, screen, size, { 0, 0 }, &dwBytesWritten);

此特定功能WriteConsoleOutputCharacter as per microsoft's documentation有两个变种,WriteConsoleOutputCharacterW()WriteConsoleOutputCharacterA(),但您正在调用基于您的选项的宏版本,选择哪个功能是这两个变体是不同的,因为第一个变体是宽字符,后者是ANSI字符。