用WIN32读取文本文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用WIN32读取文本文件相关的知识,希望对你有一定的参考价值。

我正在尝试使用c ++中的win32程序解析文本文件。是否有一种逐行读取文本文件的简单方法?我的文本文件由我想要存储在char数组中的字符串组成(const char * cArray [67])。这是我到目前为止所拥有的。我正在使用CreateFile和ReadFile。我从readfile获得访问冲突错误(0x000003e6):

CDECK::CDECK():filename(".\Deck/list.txt")
{
    LPVOID data = NULL;
    hFile = CreateFileA(filename, GENERIC_READ,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile == INVALID_HANDLE_VALUE)
        MessageBox(NULL, L"Failed to CreateFile - 'hFile'", L"CDECK::CDECK()", MB_OK);

    DWORD fileSize = GetFileSize(hFile, &fileSize);
    DWORD read = -1;
    if(!ReadFile(hFile, data, fileSize, &read, NULL))
    {
        DWORD err = GetLastError();
        MessageBox(NULL, L"Failed to ReadFile - 'hFile'", L"CDECK::CDECK()", MB_OK);
    }
    return;
}
答案

是否有一种逐行读取文本文件的简单方法?

是:

{
  std::ifstream hFile(filename);

  std::vector<std::string> lines;
  std::string line;
  while(std::getline(hFile, line))
    lines.push_back(line);

  return lines;
}
另一答案

考虑以下代码:

LPVOID data = NULL;
if(!ReadFile(hFile, data, fileSize, &read, NULL))

这里data为null,以下参数是整个文件的大小。你应该分配一个缓冲区,然后将指针传递给这样的缓冲区及其大小。有ReadFile函数将写入readed字节。

以下是使用静态大小缓冲区的简单方法:

char data[4096] = {};
if(!ReadFile(hFile, static_cast< LPVOID >( &data ), 4096, &read, NULL))
另一答案

您的问题是您正在读取文件的字节,读取使用SysAllocStringByteLen分配字符串位置所需的字符串,然后使用ReadFile

另一答案

在读取数据之前忘了分配缓冲区空间:LPVOID data = NULL;

在阅读之前,必须分配一个fileSize缓冲区空间:data = malloc(fileSize);

并且可能还必须将您的数据变量声明为char *而不是void *

以上是关于用WIN32读取文本文件的主要内容,如果未能解决你的问题,请参考以下文章

python将文本转换成语音的代码

C++下批量读取名字无规则的图片文件的示例代码(利用类WIN32_FIND_DATA实现)

Windows上无法读取的文件属性

Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?

使用 win32api keybd_event 选择文本

COM 端口上的 Win32 重叠读取文件返回 ERROR_OPERATION_ABORTED