3.9 KiB
3.9 KiB
CSV加载闪退问题修复总结
修复完成时间
2025-11-14
问题描述
"Load from CSV" 功能在加载CSV文件时导致程序闪退
根本原因分析
经过详细代码审查,发现以下问题:
-
Windows路径编码问题(主要原因)
- 在
examples/qt_gui_demo.cpp中使用QString::toStdString()转换文件路径 - 在Windows MINGW环境下,当文件路径包含中文或特殊字符时,这种转换会产生错误的编码
- 导致文件无法正确打开或程序崩溃
- 在
-
单点路径处理不完整
- 在
src/path_curve.cpp的setPathPoints函数中,单点情况下theta和kappa未明确处理 - 虽然不会直接导致崩溃,但可能引发后续问题
- 在
-
异常信息不够详细
- CSV解析异常信息不够详细,难以定位问题
已应用的修复
修复1: Windows路径编码问题
文件: examples/qt_gui_demo.cpp
- 第309行: 将
filename.toStdString()改为filename.toLocal8Bit().constData() - 第326行: 将
filename.toStdString()改为filename.toLocal8Bit().constData() - 效果: 正确处理Windows路径,包括中文路径和特殊字符
修复2: 改进单点路径处理
文件: src/path_curve.cpp
- 第133行: 添加注释说明单点情况的处理逻辑
- 效果: 明确单点情况下保持原有theta和kappa值,避免越界访问
修复3: 改进异常处理
文件: src/path_curve_custom.cpp
- 第49行: 将
catch (const std::exception&)改为catch (const std::exception& e) - 第50行: 错误消息中添加
e.what()以显示详细异常信息 - 效果: 提供更详细的错误诊断信息
修改的文件列表
examples/qt_gui_demo.cpp- 修复路径编码问题src/path_curve.cpp- 改进单点处理src/path_curve_custom.cpp- 改进异常处理
备份文件
所有修改前的文件已备份:
examples/qt_gui_demo.cpp.backupsrc/path_curve.cpp.backupsrc/path_curve_custom.cpp.backup
下一步操作
需要重新编译项目以应用这些修复:
cd build
# 清理旧的构建(可选)
cmake --build . --target clean
# 重新构建(Release版本)
cmake --build . --config Release
# 或者构建Debug版本用于调试
cmake --build . --config Debug
测试建议
修复后建议测试以下场景:
- ✓ 加载包含中文路径的CSV文件
- ✓ 加载纯英文路径的CSV文件
- ✓ 加载只有2列(x, y)的CSV文件
- ✓ 加载完整4列(x, y, theta, kappa)的CSV文件
- ✓ 加载只有1个数据点的CSV文件
- ✓ 加载空的CSV文件(只有header)
- ✓ 加载格式错误的CSV文件(测试错误处理)
技术细节
QString::toLocal8Bit() vs toStdString()
toStdString(): 使用系统默认编码,在Windows上可能导致编码问题toLocal8Bit(): 使用本地8位编码(Windows上是ANSI/GBK),更适合处理文件路径.constData(): 返回const char*指针,可以直接用于std::string构造
修复的关键代码对比
修复前:
if (custom_path_.loadFromCSV(filename.toStdString(), true)) {
修复后:
// 修复: 使用toLocal8Bit以正确处理Windows路径(包括中文路径)
if (custom_path_.loadFromCSV(filename.toLocal8Bit().constData(), true)) {
预期效果
修复后,程序应该能够:
- 正确加载包含中文路径的CSV文件
- 正确处理各种格式的CSV文件(2列、3列、4列)
- 在遇到错误时显示详细的错误信息而不是直接崩溃
- 提供更好的用户体验和错误提示
附加说明
如果问题仍然存在,可以检查以下内容:
- CSV文件编码是否为UTF-8(建议使用UTF-8 without BOM)
- CSV文件格式是否正确(逗号分隔,每行至少2个数值)
- 查看控制台输出的详细错误信息
- 检查是否有其他程序占用文件