【问题标题】:Reading a Text File w/ WIN32使用 WIN32 读取文本文件
【发布时间】:2012-05-26 08:56:19
【问题描述】:

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

【问题讨论】:

  • 太糟糕了,你不能为此使用 Python 之类的东西.....
  • 直接使用winapi调用吗?您可以使用std::ifstream 读取数据,并将结果存储在std::vector<std::string> 中吗?
  • Win32 API 在使简单任务变得尽可能困难方面所做出的扭曲令人难以置信。用普通的旧 C++ 试试;简单。 Python、Ruby、Perl……简单、简单、简单。如果您知道自己在做什么,即使是好的旧 C 也不会太糟糕。但是在 Windows API 层中,你突然被一个虫洞射到了 Borg 的肚子里。
  • @DavidO win32 界面与 C 的打开/读取几乎相同

标签: c++ winapi file-io


【解决方案1】:

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

是的:

{
  std::ifstream hFile(filename);

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

  return lines;
}

【讨论】:

  • 这不是逐字而不是逐行获取文本吗?
  • 呃。当然。固定的。不过,令人惊讶的是,三个人对我明显不正确的答案投了赞成票。
【解决方案2】:

考虑这段代码:

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))

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你是从哪里得到使用SysAllocStringByteLen的要求的?
    • msdn.microsoft.com/pt-br/library/windows/desktop/… 或者你也可以使用 VirtualAlloc,想法是在读取之前分配一个虚拟空间。
    • Windows BSTRings(由SysAllocstringByteLen 生成)专门用于 COM/OLE 代码,否则对它们没有任何好处。 ReadFile 对任何缓冲区都很满意。最简单的是std::string
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2010-12-17
      • 2020-03-20
      • 2019-06-10
      • 2010-11-27
      相关资源
      最近更新 更多