每行 6 個浮點數,逗號分隔,示例:
0,-1145.1,2037.8,-0,-494.02,0
0,-2285.2,4060.2,-0,-982.1,0
#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;
}
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 加速
| 方案 | 耗時 | 代碼複雜度 | 適用場景 |
|---|---|---|---|
| iostream + stringstream | ~2.5s | 低 | 通用業務、原型開發 |
| fscanf | ~0.3s | 極低 | 高性能需求、格式固定 |
| 手寫解析器 | ~0.05s | 高 | 極大數據集、實時系統 |
getline 自動處理,fscanf 需在格式串加 \n 或空格1.23e-4,%lf 和 stringstream 均支援-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)) {
// 處理數據
}