从来没有这样做过。如果我使用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
}
答案 0 :(得分:3)
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);