M.S. Student at Korea Univ.
TODAY 5 TOTAL 21,245
How to convert string buffer to int(float) fast in C++(고정된 길이 문자열을 숫자로 빠르게 변환)

How to convert string buffer to int(float) fast in C++

고정된 길이 문자열을 숫자로 빠르게 변환하기


 파일을 읽을 때 buff는 char*로 변환되는데 그 값은 int나 float과 같은 숫자여서 변환해야 한다. 이때 STL에서 제공하는 함수 stoul 등을 쓰면 되긴 하지만 속도가 느리다.

그래서 아래와 같이 할 것을 권장한다.
소개하자면 한 글자식 읽으며 ASCII 코드값을 이용하여 '0'을 빼준 후에 10을 곱하면 정수가 된다.
10을 나눠주면 소수가 된다. 예를 들어 1234라는 숫자를 targetint라는 변수에 저장하고 싶다.

1: targetint = 1
2: targetint = 1*10 + 2
3: targetint = (1*10 + 2) *10 + 3
4: targetint = ((1*10 + 2) *10 + 3) *10 + 4

소수 0.123을 읽을 때는
1. targetdouble = 3
2. targetdouble = 2 + 3*0.1
3. targetdouble = 1 + 0.2 + 0.03
4. targetdouble = 0.1 + 0.02 + 0.003

이 되는 것과 같다. 

아래 코드는 파일을 읽고 미리 Line 수와 한 라인에 들어있는 char의 수를 안다고 가정하였다.

#include <cstdio>
#define LineNum 30000
#define CharInLine 24

using namespace std;

void stringtonumber(const char* _path){
    pFile = fopen(_path, "rb");

    //read size of file
    fseek(pFile, 0, SEEK_END);
    long lSize = ftell(pFile);
    fseek(pFile, 0, SEE`K_SET);

    char *buff = (char*)malloc(sizeof(char)*lSize);

    unsigned int totnum = 0;
    unsigned int curnum = 0;

    //read all
    result = fread(&buff[totnum],sizeof(char),lSize);
    if (totnum != lSize) {
        cout << "not read all file" << endl;
    }

    //read all big file
    while ((curnum = fread(&buff[totnum], sizeof(char), lSize - totnum, pFile)) > 0) {
        totnum += curnum;
    }

    for (unsigned int i = 0; i != LineNum; i++) {

        unsigned int targetint;
        double targetdouble = 0.0;

        unsigned int tempindex = i * CharInLine;
        //if buff[6~12] is targetint
        for (short j = 6; j < 12; j++) {
            targetint = targetint * 10 + ((int)buff[j + tempindex] - '0');
        }
        //if buff[22~16] is targetdouble
        if (buff[tempindex + 15] == '1') {
            targetdouble = (double)1.0;
        }
        else {
            for (short j = 22; j != 16; j--) {
                targetdouble = targetdouble * double(0.1) + ((int)buff[j + tempindex] - '0');
            }
            targetdouble = targetdouble * 0.1;
        }
    }

}


0  Comments,   0  Trackbacks
댓글 쓰기

티스토리 툴바