函数`feof`始终返回1

Jim*_*ell 0 c c++ file-io feof visual-studio-2015

我正在尝试读取大小为114,808字节的二进制文件.我为文件分配内存,然后尝试使用fopen和读取文件fread.第一次fread被调用时,它总是以274个字节读取,并且后续调用feof始终返回1,即使显然没有到达文件的末尾.为什么是这样?

根据MSDN文档feof,"该FEOF函数返回非零值,如果读取操作已试图读到文件的结束;否则它返回0".所以我不明白是什么导致feof一直回归1.

这是我到目前为止的代码.任何帮助将非常感激.谢谢!

// Open source file with read-only access
if ( iError == ERROR_SUCCESS )
{
    #ifdef _MSC_VER
    #pragma warning(disable : 4996)
    #endif
    pFile = fopen( pSrcPath, "r" );

    if ( pFile == NULL )
    {
        iError = ERROR_FILE_NOT_FOUND;
    }
}

// Read in source file to memory
if ( iError == ERROR_SUCCESS )
{
    do
    {
        // Buffer pointer passed to fread will be the file buffer, plus the
        //  number of bytes actually read thus far.
        iSize = fread( pFileBuf + iActReadSz, 1, iReqReadSz, pFile );
        iError = ferror( pFile );   // check for error
        iEndOfFile = feof( pFile ); // check for end of file

        if ( iError != 0 )
        {
            iError = ERROR_READ_FAULT;
        }
        else if ( iEndOfFile != 0 )
        {
            // Read operation attempted to read past the end of the file.
            fprintf( stderr,
                "Read operation attempted to read past the end of the file. %s: %s\n",
                pSrcPath, strerror(errno) );
        }
        else
        {
            iError = ERROR_SUCCESS; // reset error flag
            iActReadSz += iSize;    // increment actual size read
            iReqReadSz -= iSize;    // decrement requested read size
        }
    }
    while ((iEndOfFile == 0) && (iError == ERROR_SUCCESS));
}

// Close source file
if ( pFile != NULL )
{
    fclose( pFile );
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,我正在尝试编写此代码,以便源代码与C或多或少兼容,即使MSVS基本上迫使您进入C++环境.

Ran*_*832 7

您没有在fopen的模式字符串中包含"b".在MS Windows上,以文本模式打开文件将导致(在读取二进制文件时通常不会发生这种情况)它会在到达值为0x1A的字节时检测到EOF.