【问题标题】:ReadFile lpBuffer parameterReadFile lpBuffer 参数
【发布时间】:2012-02-29 03:12:16
【问题描述】:

我正在使用 ReadFile 读取我使用 WriteFile 写入文件的简单字符串。

有一个简单的字符串:“测试字符串,测试windows函数”。

使用 WriteFile 将其写入文件。

现在我想使用 ReadFile 来确认它已写入文件。我需要将我读到的内容与上面的原始字符串进行比较。从我拥有的文件中读取

DWORD dwBytesRead;
char buff[128];
if(!ReadFile(hFile, buff, 128, &dwBytesRead, NULL))
    //Fail

该函数返回 true,因此它正在从文件中读取。问题是buff充满了只是ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ。我以前从来没有遇到过 LPVOID,所以我不知道它是在那里还是什么。有没有办法进行这种字符串比较?

编辑:我用来写入文件的代码非常简单:

if(!WriteFile(hFile, sentence.c_str(), sentence.length(), &bytesWritten, NULL))
{
    //FAIL
}

【问题讨论】:

  • 您是否将文件指针移动到文件开头或重新打开它?
  • 您在此处提供的代码很好。问题出在其他地方。
  • 你能展示你用来写入文件的代码吗?
  • Can't get ReadFile to work 的可能重复项
  • Abyx - 我没有移动任何指针。我只是写了文件,然后我尝试从文件中读取。我假设 ReadFile 将从文件的开头开始。不是这样吗?

标签: c++ windows


【解决方案1】:

文件指针需要在WriteFile() 之后和ReadFile() 之前重绕。就目前而言,ReadFile() 不会失败,但会读取零字节,因此buff 不会改变。由于 buff 未初始化,它包含垃圾。要将文件指针倒回到文件的开头,请使用SetFilePointer()

#include <windows.h>
#include <iostream>
#include <string>

int main()
{
    HANDLE hFile = CreateFile ("myfile.txt",
                               GENERIC_WRITE | GENERIC_READ,
                               0,
                               NULL,
                               OPEN_EXISTING,
                               FILE_ATTRIBUTE_NORMAL,
                               NULL);
    if (hFile)
    {
        std::string sentence("a test");
        DWORD bytesWritten;
        if (WriteFile(hFile,
                      sentence.c_str(),
                      sentence.length(),
                      &bytesWritten,
                      NULL))
        {
            if (INVALID_SET_FILE_POINTER != SetFilePointer(hFile,
                                                           0,
                                                           0,
                                                           FILE_BEGIN))
            {
                char buf[128] = { 0 }; /* Initialise 'buf'. */
                DWORD bytesRead;

                /* Read one less char into 'buf' to ensure null termination. */
                if (ReadFile(hFile, buf, 127, &bytesRead, NULL))
                {
                    std::cout << "[" << buf << "]\n";
                }
                else
                {
                    std::cerr << "Failed to ReadFile: " <<
                        GetLastError() << "\n";
                }
            }
            else
            {
                std::cerr << "Failed to SetFilePointer: " <<
                    GetLastError() << "\n";
            }

        }
        else
        {
            std::cerr << "Failed to WriteFile: " << GetLastError() << "\n";
        }

        CloseHandle(hFile);
    }
    else
    {
        std::cerr << "Failed to open file: " << GetLastError() << "\n";
    }

    return 0;
}

【讨论】:

  • 是的,这就是问题所在。谢谢,这让我很头疼
【解决方案2】:

该函数返回 true,因此它正在从文件中读取。问题是buff充满了只是ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ。

ReadFile 仅将缓冲区填充到dwBytesRead 的值。如果您尝试使用字符串,则必须在 ReadFile 返回后自行终止它:

buff [dwBytesRead] = 0;

【讨论】:

    【解决方案3】:

    您不应该将 128 用作 nNumberOfBytesToRead,因为在打印字符串时可能会越界(或者将 buff 视为以 0 结尾的字符串)。还要检查dwBytesRead 是否真的读取了那么多字节,并按照@James McLaughlin 的建议以0 结尾。

    【讨论】:

    • 128 只能读取 128 个字符。我拥有的字符串只有 30 个字符长。我知道我可能会遇到越界问题,但是如果我使用字符串的长度进行循环,那么我不会遇到这个问题,那么我只需要检查从文件中读取的下一个字符是否为空(如果它是这样工作的,第一次做这个东西所以不确定)
    猜你喜欢
    • 2014-09-25
    • 1970-01-01
    • 2011-11-06
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2021-04-11
    相关资源
    最近更新 更多