自習室

こもります

visual c++ で unsigned long long 型の数値をテキストファイルから読み込む

long long unsigned int
= 64bit
= 8byte
= char 8文字
= 16進数16文字
= 16^16
= 1.84467441 * 10^19

くらいの出現を想定している数値をテキストファイルから読み込むのに大変苦労しました。
100京てwww

テキストファイルの中身を読んで数値としてメモリに格納するのだけど、普通に10進数で
36550632026695
とか書いてあるもんだからたいへん。atoi() ではもちろん読み込めないし、atol() でも読めない!ましてやunsigned!

というわけで、"36550632026695"を文字列としてtxtファイルから読み込んで、それをatol()で読める範囲の何文字かずつに分割し、long long unsigned int型の変数を確保し、分割した文字列を桁上げして足し直し格納する、という手法を考えました。たとえば、
"36550632026695"を、"36550"と"632026695"に分割して、
36550*10000*100000 + 632026695
と計算して格納するかんじ。

visual c++ では long unsigned int が32bit = 4byte 最大 4294967296 まで表すことが出来るので、19桁の整数となると、19桁を上9桁と下10桁に分割して処理してもなお最大値に当たる危険性があるので、本当は 6+7+7 の3部に分割すべきなのだろうけど、実際は上記の "36550632026695" のように14桁の数字しか無かったので、上5桁と下9桁で分割することにしました。(これは改善すべき)

と言うわけで、string文字列で表された数字の列を読んで、long long unsigned で出力する関数を作りました。

long long unsigned int myAtoll(string input)
{
	int charNum = input.size();
	long long unsigned int upper = atol((input.substr(0, (charNum-9))).c_str());
	long long unsigned int lower = atol((input.substr((charNum-9))).c_str());
	long long unsigned int ans = upper*100000*10000 + lower;
	return ans;
}

+

環境による整数型の違いについてはwikipedia参照。
http://ja.wikipedia.org/wiki/%E6%95%B4%E6%95%B0%E5%9E%8B#.E3.83.87.E3.83.BC.E3.82.BF.E5.9E.8B.E5.90.8D