# CSV加载闪退问题 - 完整修复报告 ## 问题诊断 **问题现象**: "Load from CSV" 功能在加载CSV文件时导致程序闪退 **环境**: Windows 10, MINGW64, Qt GUI应用 ## 根本原因 经过深入分析代码,确定主要原因为: ### 1. Windows路径编码问题 ⭐⭐⭐(主要原因) **位置**: `examples/qt_gui_demo.cpp` 第309行和第326行 **问题**: ```cpp custom_path_.loadFromCSV(filename.toStdString(), true) ``` 在Windows MINGW环境下,`QString::toStdString()` 对包含中文或特殊字符的路径转换不正确,导致: - 文件无法打开 - 路径字符串损坏 - 程序崩溃 **解决方案**: ```cpp // 使用toLocal8Bit()替代toStdString() std::string filepath = filename.toLocal8Bit().constData(); custom_path_.loadFromCSV(filepath, true) ``` ### 2. 单点路径处理不明确 **位置**: `src/path_curve.cpp` 第106-134行 **问题**: 当CSV文件只包含1个数据点时,该点的theta和kappa未被明确处理 **解决方案**: 添加注释说明单点情况保持原值,避免混淆 ### 3. 异常信息不够详细 **位置**: `src/path_curve_custom.cpp` 第48-52行 **问题**: 异常捕获时未记录详细错误信息 **解决方案**: 输出异常的what()内容以便诊断 ## 已应用的修复 ### 修复清单 ✅ **文件1**: `examples/qt_gui_demo.cpp` - 第309行: 使用 `toLocal8Bit().constData()` 替代 `toStdString()` - 第326行: 同上 - 添加了解释性注释 ✅ **文件2**: `src/path_curve.cpp` - 第133行: 添加单点处理说明注释 ✅ **文件3**: `src/path_curve_custom.cpp` - 第49行: 捕获异常时获取详细信息 - 第50行: 输出异常的 `what()` 内容 ### 备份文件 所有原始文件已备份: ``` ./examples/qt_gui_demo.cpp.backup ./src/path_curve.cpp.backup ./src/path_curve_custom.cpp.backup ``` ## 代码对比 ### 修复前后对比 **qt_gui_demo.cpp (第309行)** 修复前: ```cpp if (custom_path_.loadFromCSV(filename.toStdString(), true)) { ``` 修复后: ```cpp // 修复: 使用toLocal8Bit以正确处理Windows路径(包括中文路径) if (custom_path_.loadFromCSV(filename.toLocal8Bit().constData(), true)) { ``` **path_curve_custom.cpp (第49-50行)** 修复前: ```cpp } catch (const std::exception&) { std::cerr << "Error parsing line " << line_num << ": " << line << std::endl; ``` 修复后: ```cpp } catch (const std::exception& e) { std::cerr << "Error parsing line " << line_num << ": " << line << " (" << e.what() << ")" << std::endl; ``` ## 下一步操作 ### ⚠️ 重要:重新编译 **注意**: 当前 `agv_qt_gui.exe` 正在运行(PID: 2996),需要先关闭程序才能重新编译。 #### 步骤1: 关闭程序 - 方法A: 在任务管理器中结束 `agv_qt_gui.exe` 进程 - 方法B: 在Windows命令提示符中运行: `taskkill /F /IM agv_qt_gui.exe` #### 步骤2: 重新编译 ```bash cd build cmake --build . --config Release ``` #### 步骤3: 测试修复 运行新编译的程序: ```bash ./build/Release/agv_qt_gui.exe ``` ## 测试建议 修复后请测试以下场景(按优先级排序): ### 高优先级测试 1. ✓ 加载包含**中文路径**的CSV文件(最重要) 2. ✓ 加载存放在中文文件夹中的CSV文件 3. ✓ 加载包含空格的路径 ### 常规测试 4. ✓ 加载只有2列(x, y)的CSV文件 5. ✓ 加载完整4列(x, y, theta, kappa)的CSV文件 6. ✓ 加载只有1个数据点的CSV文件 ### 错误处理测试 7. ✓ 加载空CSV文件(只有header) 8. ✓ 加载格式错误的CSV文件 9. ✓ 加载不存在的文件 ## 技术说明 ### QString编码转换对比 | 方法 | Windows行为 | 适用场景 | 问题 | |------|------------|---------|------| | `toStdString()` | 使用系统默认编码 | 纯ASCII路径 | 中文路径乱码或崩溃 | | `toLocal8Bit().constData()` | 使用本地编码(GBK/ANSI) | Windows文件路径 | ✓ 正确处理中文 | | `toUtf8().constData()` | 使用UTF-8编码 | 跨平台文本 | Windows路径可能有问题 | **结论**: 在Windows上处理文件路径时,应使用 `toLocal8Bit()` ## 预期效果 修复后,程序应该: - ✓ 不再因路径问题而崩溃 - ✓ 正确处理中文路径和特殊字符 - ✓ 提供详细的错误信息(如果CSV格式有问题) - ✓ 更稳定的用户体验 ## 文档索引 相关文档: 1. `FIX_SUMMARY.md` - 详细修复总结 2. `CSV_LOAD_FIX.md` - 修复方案详解 3. `BUILD_INSTRUCTIONS.md` - 编译说明 ## 技术支持 如果问题仍然存在,请检查: 1. 是否已重新编译(非常重要!) 2. CSV文件编码(建议UTF-8 without BOM) 3. CSV格式是否正确(逗号分隔,至少2列数值) 4. 控制台是否有详细错误信息 5. 文件是否被其他程序占用 --- **修复日期**: 2025-11-14 **修复状态**: ✅ 代码已修复,等待重新编译和测试 **影响范围**: CSV文件加载功能 **风险评估**: 低风险(仅修改字符串转换方式和添加注释)