Регистрация | Вход
csvparcer2.hpp#pragma onceusing namespace std;struct dbltab{ double** data; int rows, cols;};class Csv2{ static double atofse(char* s, char* e) { long double res = 0; int sign = 1, powflag = 0; unsigned long long pow = 1; if (*s == '-') { sign = -1; s++; } while (s != e) { if (*s >= '0' && *s <= '9') { res = res * 10 + (*s - '0'); if (powflag) pow *= 10; } else if (*s == '.') powflag = 1; ++s; } return sign * (res / pow); }public: static dbltab parse(const char* path, char tok1 = ',', char tok2 = '\n') { FILE* F; fopen_s(&F, path, "r"); fseek(F, 0, SEEK_END); int flen = ftell(F); fseek(F, 0, SEEK_SET); char* text = new char[flen]; fread(&text[0], 1, flen, F); fclose(F); int lines = 0; for (int i = 0; i < flen; ++i) if (text[i] == tok2) ++lines; char* fl = 0; for (int i = 0; i < flen; ++i) { if (text[i] == tok2) { fl = text + i; break; } }; int rows = 1; for (char* b = text; *b != *fl; ++b) if (*b == tok1) ++rows; double** data = new double* [lines]; data[0] = new double[rows]; char* c = text; char* p = text; int i = 0, j = 0; while (1) { if (*c == tok1 || *c == tok2 || *c == 0) { data[i][j++] = atofse(p, c); p = c + 1; } if (*c == tok2) { data[++i] = new double[rows]; j = 0; ++c; } if (*c == 0) break; ++c; } return { data,rows,lines }; }};
main.cpp#include <iostream>#include <sstream>#include "csvparcer2.hpp"#include <math.h>using namespace std;static double atof2(char* s){ long double res = 0; int sign = 1, powflag = 0; unsigned long long pow = 1; if (*s == '-') { sign = -1; s++; } while (*s != 0) { if (*s >= '0' && *s <= '9') { res = res * 10 + (*s - '0'); if (powflag) pow *= 10; } else if (*s == '.') powflag = 1; ++s; } return sign * (res / pow);}char** manydig(int n){ char** digs = new char* [n]; for (int i = 0; i < n; ++i) { digs[i] = new char[20]; double v = (2 * (double)rand() / RAND_MAX - 1) * 10; sprintf_s(digs[i],20, "%f", v); } return digs;}int main(){ int n = 10000000; char** digs = manydig(n); double* fl = new double[n]; clock_t t = clock(); for (int i = 0; i < n; ++i) { fl[i] = atof(digs[i]); //if(i<10) printf("%f\n", fl[i]); } double atof_t = clock() - t; printf("time atof: %f\n", atof_t); t = clock(); for (int i = 0; i < n; ++i) { fl[i] = atof2(digs[i]); //if(i<10) printf("%f\n", fl[i]); } double atof2_t = clock() - t; printf("time atof2: %f\n", atof2_t); printf("atof/atof2: %f\n", atof_t/ atof2_t); t = clock(); dbltab ds = Csv2::parse("M:/inputs.csv"); printf("parse inputs.csv: %d\n", clock() - t); getchar();}
static double atof2(char* s){ long double res = 0; int sign = 1, powflag = 0; unsigned long long pow = 1; if (*s == '-') { sign = -1; s++; } while (*s != 0) { if (*s >= '0' && *s <= '9') { res = res * 10 + (*s - '0'); if (powflag) pow *= 10; } else if (*s == '.') powflag = 1; ++s; } return sign * (res / pow);}