首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 文件讀取解析導致 std::invalid_argument 異常的調試與修復

     編輯:程式設計綜合問答

異常信息分析

錯誤提示:std::invalid_argument 於內存位置 0x0042ef1c,通常由 stoi() 或 atoi() 處理非數字字符串引起。

代碼核心問題定位

1. 解析邏輯缺陷

fun_substr 函數按空格分割,但未處理連續空格、行尾換行符,導致字段解析錯位。

2. 數據類型轉換風險

// 危險代碼:vec[i+4] 可能非純數字
c1[j].oil = stoi(vec[i+4].c_str());

3. 向量擴容邏輯錯誤

vec.resize(9) 可能截斷數據或填充空字符串,導致後續索引越界。

修復方案

增強版解析函數

void fun_substr(fstream &file, const string& sep, vector& vec) {
    string line;
    while (getline(file, line)) {
        if (line.empty()) continue;
        size_t start = 0;
        size_t end = line.find(sep);
        while (end != string::npos) {
            string token = line.substr(start, end - start);
            if (!token.empty()) vec.push_back(token);
            start = end + sep.length();
            end = line.find(sep, start);
        }
        string last = line.substr(start);
        if (!last.empty()) vec.push_back(last);
    }
}

安全轉換包裝

int safeStoi(const string& s, int defaultVal = 0) {
    try {
        size_t pos;
        int val = stoi(s, &pos);
        return (pos == s.length()) ? val : defaultVal;
    } catch (...) {
        return defaultVal;
    }
}

// 使用示例
c1[j].oil = safeStoi(vec[i+4]);

調試建議

  1. 在 Visual Studio 中啟用「斷點於拋出異常」
  2. 輸出 vec 內容檢查解析結果
  3. 驗證 big_car.txt 文件格式是否符合預期
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved