使用std::fstream打开二进制文件失败,路径正确却无法打开
问题解答
关于文件后缀的假设
你的假设完全正确,文件后缀(比如.bin)只是用来标识文件用途的约定,不影响标准库以二进制模式打开并读取文件。只要文件本身是有效的,不管后缀是什么,用std::ios::binary模式打开都能正常处理二进制内容。
文件无法打开的排查与修复
针对你在DLL中打不开文件的问题,从以下几个方向排查和修复:
明确文件打开模式
你用std::fstream默认是读写模式(std::ios::in | std::ios::out),如果目标文件没有写入权限(比如系统目录下的文件),会导致打开失败。既然你只需要读取文件,应该用std::ifstream并明确指定读取+二进制模式:std::ifstream binaryFile; binaryFile.open(cdgName, std::ios::in | std::ios::binary);正确判断文件是否打开成功
优先用is_open()判断文件是否成功打开,good()会同时检查eofbit、failbit、badbit,刚打开时即使文件正常,也可能因为其他状态位导致good()返回false。修改判断逻辑:if (binaryFile.is_open()) { // 读取逻辑 binaryFile.close(); } else { MessageBoxA(NULL, cdgName, "File Error!", MB_OK); }检查DLL的工作目录与路径编码
- DLL的当前工作目录不一定和主程序一致,不过你用的是绝对路径,这个问题可能性较低,但可以通过输出
GetCurrentDirectoryA的结果确认。 - 确认
cdgName是正确的ANSI编码字符串:如果路径包含非ASCII字符,MessageBoxA可能显示不全或乱码,导致实际路径错误。如果是宽字符路径,建议改用std::wifstream和MessageBoxW。
- DLL的当前工作目录不一定和主程序一致,不过你用的是绝对路径,这个问题可能性较低,但可以通过输出
读取二进制数据的代码问题
即使文件打开成功,你当前的读取逻辑while (binaryFile >> i)也是错误的:>>是格式化输入运算符,会自动跳过空白字符,这在二进制读取中完全不符合需求。正确的二进制读取应该用read()函数:
BYTE i[24]; // 循环读取24字节块,直到文件结束 while (binaryFile.read(reinterpret_cast<char*>(i), sizeof(i))) { // 处理读取到的24字节数据 } // 检查是否是正常结束还是读取错误 if (!binaryFile.eof() && binaryFile.fail()) { MessageBoxA(NULL, "Read Error!", "Error", MB_OK); }
内容的提问来源于stack exchange,提问作者theDickChuck
相关产品推荐
相关产品推荐

