繁体   English   中英

Win32文件IO工作但fopen等。 人。 失败。 这里发生了什么?

[英]Win32 File IO works but fopen et. al. fails. What is going on here?

从来没有那样过。 如果我使用fopen()等函数从磁盘读取文件,fopen会成功,但FILE *内容看起来有点像NULL-ish。 然后我尝试fseek(SEEK_END)并报告该文件大小为0字节。

如果我对CreateFile(),GetFileSize(),ReadFile()做同样的事情,它就可以了。 功能相同,路径相同......

VS2013社区版,Win7 x64,64位编译。 我测试的文件很小(从不超过400字节)。 它们位于E:drive(E:\\ temp),这是一个本地分区。

我需要焊接我的电脑来修复它的任何想法? :)

static void LoadFile(const std::string &path, std::string& target)
{
#if 1
    HANDLE hFile = ::CreateFileA(path.c_str(), FILE_READ_ACCESS, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    finally finallyClose([&hFile](){ ::CloseHandle(hFile); });
    if (INVALID_HANDLE_VALUE != hFile)
    {
        DWORD fileSize = ::GetFileSize(hFile, NULL);
        target.resize(fileSize);
        DWORD bytesRead = 0UL;
        BOOL success = ::ReadFile(hFile, &target[0], fileSize, &bytesRead, NULL);
    }
    else
    {
        std::cout << "Could not load file: " << path << std::endl;
    }

#else
    FILE * inFile = NULL;
    errno_t err = fopen_s(&inFile, path.c_str(), "rb");

    if (NULL != inFile)
    {
        finally finallyClose([&inFile](){ fclose(inFile); });

        int fileSize = fseek(inFile, 0, SEEK_END);
        fseek(inFile, 0, SEEK_SET);
        target.resize(fileSize);
        fread(&target[0], sizeof(char), fileSize, inFile);
    }
    else
    {
        std::cout << "Could not load file: " << path << std::endl;
    }
#endif
}

fseek函数在成功时返回0。 它不返回文件指针移动的字节数。

http://en.cppreference.com/w/c/io/fseek

你需要调用ftell来恢复文件大小。

http://en.cppreference.com/w/c/io/ftell

fseek(inFile, 0, SEEK_END);
int filesize = ftell(inFile);
target.resize(filesize);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM