Visual studio 2015 VS2015:fseek操作后的fread不准确

Visual studio 2015 VS2015:fseek操作后的fread不准确,visual-studio-2015,fread,fseek,Visual Studio 2015,Fread,Fseek,在将项目从vs2008移动到vs2015的过程中,我陷入了vs2015 libc中的一个bug。 问题是,在对位置X进行fseek操作后,fread从X+10开始读取数据 不会引发任何错误,在fseek操作返回有人值守的位置后,ftell调用,但fread不会在有人值守的位置启动。此外,这取决于之前的fseek/fread操作 使用VS2008(32或64位)运行时不存在此问题,使用VS2015(32或64位)运行时存在此问题 提前感谢您的任何想法 二进制文件可用。 示例代码: #include

在将项目从vs2008移动到vs2015的过程中,我陷入了vs2015 libc中的一个bug。 问题是,在对位置X进行fseek操作后,fread从X+10开始读取数据

不会引发任何错误,在fseek操作返回有人值守的位置后,ftell调用,但fread不会在有人值守的位置启动。此外,这取决于之前的fseek/fread操作

使用VS2008(32或64位)运行时不存在此问题,使用VS2015(32或64位)运行时存在此问题

提前感谢您的任何想法

二进制文件可用。 示例代码:

#include <fstream>
#include <iostream>
#include <iomanip>
#include <windows.h>

bool foo(FILE *f, unsigned char *buffer, int seek_to, int read_bytes)
{
    size_t res = 0;
    std::cout << "\tSeek to " << seek_to << std::endl;
    // issue present if using fseek or _fseeki64
    if (fseek(f, seek_to, SEEK_SET) != 0)
    {
        std::cout << "\tFAILED" << std::endl;
        return false;
    }
    std::cout << "\tRead " << read_bytes << " bytes" << std::endl;
    if ((res = fread(buffer, 1, read_bytes, f)) != read_bytes)
    {
        std::cout << "\tFAILED, " << res << "bytes readen" << std::endl;
        return false;
    }
return true;
}

// issue is present in 32 and 64bits of VS2015 update 3
int main(int argc, char **argv)
{
    // open the AVC binary file
    FILE *favc = fopen(argv[1], "rb");    
    // big buffer
    unsigned char *buffer = new unsigned char[1024*1024];
    // step 1, seek and read
    std::cout << "Step 1" << std::endl;
    foo(favc, buffer, 35026374, 7730);
    std::cout << "Step 2" << std::endl;
    foo(favc, buffer, 35030470, 8192);
    // failing reading, buffer should start with 00 00 00 01 09
    std::cout << "Step 3 - where all failed" << std::endl;
    foo(favc, buffer, 35034577, 16428);
    std::cout << "Buffer: '";
    for (size_t i = 0; i < 5; ++i) std::cout << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)buffer[i];
    std::cout << "'" << std::endl;
    unsigned int v = *((unsigned int*)(buffer+1));
    if (v != 0x09010000) std::cout << "ISSUE DETECTED" << std::endl;
    return 0;
}
#包括
#包括
#包括
#包括
bool foo(文件*f,无符号字符*buffer,整数搜索到,整数读取字节)
{
大小=0;

std::cout问题被确认为SDK8.1目标上的VC Redist 2015的一个bug。 请参见此处的错误跟踪:

和MSDN论坛状态:

解决办法是: -不要使用fopen/fread/fseek函数,首选WIN32 API CreateFile/。。。
-目标Windows 10(不是SDK8.1的7)

注意:-如果使用fread_s/fopen_s或_open/_lseek/_read函数,也会出现此问题。如果使用_open、_read和_lseek,则不会出现此问题。VS2015上的fopen中的缓冲错误在VS2017中也会出现。使用setvbuf调整缓冲大小也会更改问题位置。这似乎确实是缓冲的一个错误。问题是在windows 10上运行时不存在…:(