c++ ReadFile缓冲区输出很奇怪(打印内容+更多内容)

hmae6n7t  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(159)

我尝试使用Win32 API打开文件并读取其内容:

HANDLE hFileRead = CreateFileA(FilePath,
                               GENERIC_READ,
                               0,
                               NULL,
                               OPEN_EXISTING,
                               FILE_ATTRIBUTE_NORMAL,
                               NULL);

LARGE_INTEGER fileSize = { 0 };
DWORD cbFileSize = GetFileSizeEx(hFileRead, &fileSize);

PBYTE buffer = (PBYTE)HeapAlloc(GetProcessHeap(), 0, fileSize.QuadPart);
DWORD dwBytesRead = 0;

NTSTATUS s = ReadFile(hFileRead,
                      buffer,
                      fileSize.QuadPart,
                      &dwBytesRead,
                      NULL);

std::cout << buffer << "\n"; // <<< expect to print "asdasd" but prints "asdasd"+random chars (1 or more each run)

我想得到的是文件内容(在这个例子中是.txt)。我得到的是一个.txt文件的内容+一些随机字符(每次运行都不同)。
我试图写缓冲区索引,似乎缓冲区打印超过其大小(?)
我做错了什么?

pieyvz9o

pieyvz9o1#

std::cout << buffer需要buffer以空值终止,但实际上不是。您需要为终止符分配空间,例如:

PBYTE buffer = (PBYTE)HeapAlloc(GetProcessHeap(), 0, fileSize.QuadPart + 1);
...
buffer[dwBytesRead] = 0;

或者,您可以改用cout.write(),这样就不需要终结符,例如:

std::cout.write(buffer,dwBytesRead);

相关问题