3

我正在尝试使用 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;
}
4

4 回答 4

10

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

是的:

{
  std::ifstream hFile(filename);

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

  return lines;
}
于 2012-05-18T19:31:05.477 回答
6

考虑这段代码:

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

这里data为null,后面的参数是整个文件的大小。您应该分配一个缓冲区,然后将一个指向该缓冲区的指针及其大小传递给它。函数将在其中ReadFile写入读取的字节。

这是让它与静态大小的缓冲区一起工作的简单方法:

char data[4096] = {};
if(!ReadFile(hFile, static_cast< LPVOID >( &data ), 4096, &read, NULL))
于 2012-05-18T19:14:41.503 回答
0

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

于 2012-05-20T03:57:43.533 回答
0

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

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

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

于 2018-11-18T10:29:48.843 回答