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