2016. 11. 15. 16:45, Computer/Algorithm
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;
}
}
}
'Computer > Algorithm' 카테고리의 다른 글
JSON 포맷 스트링 예쁘게 출력하는 코드(JsonPrettyPrint) (0) | 2017.08.07 |
---|---|
C++ 길이가 다른 라인 스트링 분할 Strtok 예제 (0) | 2016.11.16 |
How to Read Big File in C++ (대용량 파일 읽기) (2) | 2016.11.15 |
c++ std 이용하여 string을 unsigned int로 변환하기 (0) | 2016.10.30 |
c++ std 이용하여 string 분할하기 (0) | 2016.10.03 |
Comments, Trackbacks