首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows中的ReadFile()

Windows中的ReadFile()
EN

Stack Overflow用户
提问于 2017-04-22 11:53:30
回答 1查看 6K关注 0票数 2

我试图使用ReadFile()函数从文件中读取,但是当我打印消息时,它打印的字符太多了。

不管我是从ANSII文件还是UNICODE文件中读取,我都没有得到正确的字符。

文件中的文本是:“这是一个文本文件”。

ANSII文件的屏幕快照:

UNICODE文件的屏幕截图:

我做错什么了?

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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字符组成。

因此,要使字符串相同,需要在两个字符编码之间进行转换。请参阅本文介绍如何在文本文件中使用字节顺序标记来指示文件中使用的字符编码类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43558888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档