【问题标题】:Unable to Read from File while using ReadFIle() function in C++在 C++ 中使用 ReadFIle() 函数时无法从文件中读取
【发布时间】:2014-11-07 05:38:10
【问题描述】:

我在使用 C++ 的 ReadFile() 函数从文件中读取数据时遇到了一些问题(可能是微软特有的)。

这是我的代码

写入文件

void ClientA::SharePublicKey()
{
    printf("Sharing Public Key\n");
    HANDLE hFile = NULL;

    hFile = CreateFile(TEXT("D:\\My_Proj\\shared\\PublicKeyB.txt"),                // name of the write
                       GENERIC_WRITE,          // open for writing
                       FILE_SHARE_WRITE,                      // do not share
                       NULL,                   // default security
                       CREATE_NEW,             // create new file only
                       FILE_ATTRIBUTE_NORMAL,  // normal file
                       NULL);                  // no attr. template

    if (hFile == INVALID_HANDLE_VALUE) 
    { 
        //DisplayError(TEXT("CreateFile"));
        //_tprintf(TEXT("Terminal failure: Unable to open file \"%s\" for write.\n"), argv[1]);
        return;
    }

   // _tprintf(TEXT("Writing %d bytes to %s.\n"), dwBytesToWrite, argv[1]);

    bool bErrorFlag = WriteFile( 
                    hFile,           // open file handle
                    pbPublicKey,      // start of data to write
                    dwPublicKeyLen,  // number of bytes to write
                    &lpNumberOfBytesWritten, // number of bytes that were written
                    NULL);            // no overlapped structure

    if (FALSE == bErrorFlag)
    {
       // DisplayError(TEXT("WriteFile"));
        printf("Terminal failure: Unable to write to file.\n");
        return;
    }
    else
    {
        if (lpNumberOfBytesWritten != dwPublicKeyLen)
        {
            // This is an error because a synchronous write that results in
            // success (WriteFile returns TRUE) should write all data as
            // requested. This would not necessarily be the case for
            // asynchronous writes.
            printf("Error: dwBytesWritten != dwBytesToWrite\n");
        }
        else
        {
          //  _tprintf(TEXT("Wrote %d bytes to %s successfully.\n"), dwBytesWritten, argv[1]);
        }
    }

    CloseHandle(hFile);
}

读取该文件

void ClientA::ReadPublicKeyOfOtherPeer()
{
    HANDLE hFile = NULL; 
    DWORD  dwBytesRead = 0;
    BYTE*   ReadBuffer = NULL;
    OVERLAPPED ol = {0};


    hFile = CreateFile(TEXT("D:\\My_Proj\\shared\\PublicKeyB.txt"),               // file to open
                        GENERIC_READ,          // open for reading
                       FILE_SHARE_READ,       // share for reading
                       NULL,                  // default security
                       OPEN_EXISTING,         // existing file only
                       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // normal file
                       NULL                 // no attr. template
                       );

    if (hFile == INVALID_HANDLE_VALUE) 
    { 
        _tprintf(TEXT("CreateFile\n"));
        _tprintf(TEXT("Terminal failure: unable to open file \"%s\" for read.\n"));
        printf("Error %x\n", GetLastError());
        return; 
    }



    if( FALSE == ReadFile(hFile, ReadBuffer, dwPublicKeyLen, &lpNumberOfBytesWritten, &ol) )
    {
       // DisplayError(TEXT("ReadFile"));
        printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError());
        CloseHandle(hFile);
        return;
    }


    if (dwBytesRead > 0 && dwBytesRead <= dwPublicKeyLen-1)
    {
        ReadBuffer[dwBytesRead]='\0'; // NULL character

        //_tprintf(TEXT("Data read from %s (%d bytes): \n"), argv[1], dwBytesRead);
        printf("%s\n", ReadBuffer);
    }
    else if (dwBytesRead == 0)
    {
        //_tprintf(TEXT("No data read from file %s\n"), argv[1]);
    }
    else
    {
       // printf("\n ** Unexpected value for dwBytesRead ** \n");
    }

    retrievedPublicByteArray = ReadBuffer;




    CloseHandle(hFile);
}

通过 SharePublicKey 方法我将数据保存在文件中。并且我已经检查它是否成功保存了文件上的数据,并且文件上的数据似乎是有效的。

通过 ReadPublicKeyOfOtherPeer 方法,我正在读取之前保存的文件。但是读取不成功在输出中我找到了以下行 -

终端故障:无法从文件中读取。 GetLastError=000003e6

【问题讨论】:

  • 我认为这是一个ERROR_NOACCESS - 你确定读者有权访问该文件,并且没有其他任何东西可以独占锁定它吗?
  • 函数失败后立即获取GetLastError。所有这些介入的_tprintf 调用很可能会被覆盖。
  • 另外,您调用_tprintf 的格式字符串具有%s 说明符,但没有参数。
  • 您确定您没有收到ERROR_IO_PENDING (0x3E5) 吗?当您像这样启动对异步文件句柄的读取时,这是预期的错误代码。
  • 不,我得到 0x3e6。是的,读者有权限访问。

标签: c++ visual-c++ file-io msdn file-management


【解决方案1】:

您将未初始化的指针 ReadBuffer 传递给 ReadFile。您需要一个足够大的缓冲区来接收结果。

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2012-10-14
    • 2021-08-27
    相关资源
    最近更新 更多