我试图使用ReadFile()函数从文件中读取,但是当我打印消息时,它打印的字符太多了。
不管我是从ANSII文件还是UNICODE文件中读取,我都没有得到正确的字符。
文件中的文本是:“这是一个文本文件”。
ANSII文件的屏幕快照:

UNICODE文件的屏幕截图:

我做错什么了?
#define BUFSIZE 4000
int _tmain(int argc, TCHAR *argv[])
{
HANDLE hIn;
TCHAR buffer[BUFSIZE];
DWORD nIn = 0;
//create file
hIn = CreateFile(argv[1],
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
//check the handle
if (hIn == INVALID_HANDLE_VALUE)
{
printf("\nOpen file error\n");
}
//read from file
if (FALSE == ReadFile(hIn, buffer, BUFSIZE - 1, &nIn, NULL))
{
printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError());
CloseHandle(hIn);
return 0;
}
if (nIn > 0 && nIn <= BUFSIZE - 1)
{
buffer[nIn] = TEXT('\0'); // NULL character
_tprintf(TEXT("Data read from %s (%d bytes): \n"), argv[1], nIn);
}
else if (nIn == 0)
{
_tprintf(TEXT("No data read from file %s\n"), argv[1]);
}
else
{
printf("\n ** Unexpected value for nIn ** \n");
}
printf("1:%s\n", buffer);
_tprintf(TEXT("\n2:%s"), buffer);
return 0;
}发布于 2017-04-22 12:34:23
Windows函数ReadFile()读取字节、unsigned char,而不是Windows大小的TCHAR,后者在现代Windows中是两个字节,而不是像Windows 95那样的一个字节。因此,您需要进行以下修改。
还请参阅C++中的tmain()和main()?,它提供了有关Windows的不同编译目标和使用的字符编码的其他信息。
首先,缓冲区应该是BYTE类型,而不是TCHAR类型。
其次,您需要确保它是零字段,所以像在BYTE buffer[BUFSIZE] = {0};中一样初始化缓冲区。
由于Windows是每个字符的UTF-16或两个字节,所以您需要确保UNICODE文本字符串的字符串结束为二进制零的两个字节,并且您需要在缓冲区长度中考虑这一点。当放置字符串结束时,需要确保它是两个零的字节,而不仅仅是一个字节。
您应该读取BUFSIZE - 2字节,以确保您读取的字节数为偶数,以防您正在读取的是UNICODE字符串。您的缓冲区大小也应该是两个的倍数,也就是它的大小。
如果字符串是您读取的ANSI字符串,那么当显示为UNICODE时,它可能看起来像垃圾,因为每个UNICODE字符将由两个ANSI字符组成。
因此,要使字符串相同,需要在两个字符编码之间进行转换。请参阅本文介绍如何在文本文件中使用字节顺序标记来指示文件中使用的字符编码类型。
https://stackoverflow.com/questions/43558888
复制相似问题