我希望此代码将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);
}
代码确实编译,但实际输出只是一串正方形:
我的理解是fread()
将读取stream
的内容并将其复制到缓冲区screen
中。我尝试将sizeof(char)
更改为sizeof(wchar_t)
并打开一个100%宽字符的文件(只是一个113 ж的字符串,所以226字节)但得到了相同的结果
我还尝试使用_wfopen_s
代替fopen_s
。
答案 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字符。