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

C++ 文本文件逐行解析浮點數數據:標準流程與高性能方案對比

     編輯:程式設計綜合問答

數據格式分析

每行 6 個浮點數,逗號分隔,示例:

0,-1145.1,2037.8,-0,-494.02,0
0,-2285.2,4060.2,-0,-982.1,0

方案一:標準 C++ iostream + stringstream(可讀性最佳)


#include 
#include 
#include 
#include 

struct DataPoint { double x, y, z, a, b, c; };

std::vector readData(const std::string& filename) {
    std::vector result;
    std::ifstream file(filename);
    std::string line;
    while (std::getline(file, line)) {
        std::stringstream ss(line);
        DataPoint dp;
        char comma;
        if (ss >> dp.x >> comma >> dp.y >> comma >> dp.z >> comma >> dp.a >> comma >> dp.b >> comma >> dp.c) {
            result.push_back(dp);
        } else {
            // 處理格式錯誤行
        }
    }
    return result;
}

方案二:C 風格 scanf/fscanf(速度最快、代碼最短)


FILE* fp = fopen("data.txt", "r");
double x, y, z, a, b, c;
while (fscanf(fp, "%lf,%lf,%lf,%lf,%lf,%lf", &x, &y, &z, &a, &b, &c) == 6) {
    // 直接使用 x,y,z,a,b,c
    process(x, y, z, a, b, c);
}
fclose(fp);

方案三:高性能手寫解析器(百萬行級別)


// 內存映射文件 + 指針解析,避免流格式化開銷
// 此處略,關鍵點:mmap + 自定義 atof,SIMD 加速

性能對比(100 萬行測試)

方案耗時代碼複雜度適用場景
iostream + stringstream~2.5s低通用業務、原型開發
fscanf~0.3s極低高性能需求、格式固定
手寫解析器~0.05s高極大數據集、實時系統

常見坑點

  • 行尾換行符差異:Windows CRLF vs Linux LF,getline 自動處理,fscanf 需在格式串加 \n 或空格
  • 科學計數法:1.23e-4,%lf 和 stringstream 均支援
  • 負零 -0:讀入為 -0.0,比較時等同於 0.0
  • 局部變量覆蓋:循環內複用變量需注意作用域

生產代碼建議封裝


class CsvParser {
public:
    explicit CsvParser(const char* filename) : fp(fopen(filename, "r")) {}
    ~CsvParser() { if (fp) fclose(fp); }
    
    bool next(double& x, double& y, double& z, double& a, double& b, double& c) {
        return fscanf(fp, "%lf,%lf,%lf,%lf,%lf,%lf", &x, &y, &z, &a, &b, &c) == 6;
    }
private:
    FILE* fp;
};

// 使用
CsvParser parser("data.txt");
double x,y,z,a,b,c;
while (parser.next(x,y,z,a,b,c)) {
    // 處理數據
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved