VS2019 C++写入Ubuntu设备数组报stream != NULL调试断言失败
问题根因
报错的直接原因是fopen调用执行失败返回了NULL空指针,后续fwrite传入空的文件流指针触发了Microsoft VC++调试库的断言校验。你在Ubuntu侧修改目录权限未生效,是因为问题出在Windows侧的文件访问逻辑,和Ubuntu本地权限没有直接关联。
可能的故障原因
- 路径格式/合法性错误
你当前代码使用Windows下的反斜杠\\作为路径分隔符,首先需要确认你拼接的pcSavePath是否是正确的Ubuntu共享目录访问路径(SMB共享路径应该以\\\\设备IP\\共享名开头);其次如果拼接出的完整路径总长度超过256字节,会导致pcFolderName/pcFileName缓冲区溢出,路径字符串损坏,fopen无法识别有效路径。 - 父目录不存在
fopen不会自动创建多级父目录,如果你拼接出的pcFolderName目录在Windows侧访问时不存在,fopen会直接返回NULL,你需要先手动创建该目录,或者在代码中增加目录创建逻辑。 - Windows侧访问权限不足
你在Ubuntu侧修改的是本地目录权限,但是Windows通过SMB访问共享目录时,使用的是你挂载共享时输入的账号权限。需要确认跑代码的Windows机器可以直接在资源管理器中访问目标路径,且能手动新建、修改文件,才说明Windows侧的访问权限正常。 - 文件名存在非法字符
如果pcUUTSerialNumber中包含/ : * ? " < > |等Windows文件名禁止的特殊字符,也会导致路径解析失败,fopen返回空。
排查方案
- 在
fopen调用后增加空指针判断和错误日志打印,快速定位问题:
pFileW = fopen(pcFileName,"wb"); if (pFileW == NULL) { // 打印错误码和完整路径,确认问题类型 printf("打开文件失败,路径:%s,系统错误码:%d\n", pcFileName, GetLastError()); perror("fopen错误描述"); return -1; }
- 把代码拼接出的完整
pcFileName路径打印出来,复制到Windows资源管理器的地址栏,确认路径可以正常访问,且支持写入操作。 - 校验
pcSavePath、pcUUTSerialNumber的取值是否合法,没有空指针、特殊字符,路径总长度不超过256字节。
内容的提问来源于stack exchange,提问作者Immortal
相关产品推荐
相关产品推荐

