2012-05-04 1 views
1

longの数値をファイルから読み込み、インクリメントしてファイルに書き戻したいと思います。
からlongへの変換に苦労しています。ファイルから数値を読み込み、インクリメントして書き戻します。

私が試した:

double id = atof("12345678901"); //using atof because numbers are too big for atio() 
id++; 
ostringstream strs; 
strs << static_cast<long>((static_cast<double>(threadId))); 
string output = strcpy_s(config->m_threadId, 20, strs.str().c_str()); 

をしかし、それは負のか、間違った番号への入力を変換します。

+3

'atof'の代わりに' strtoll'または 'strtoull'を使うことを検討してください。 – zneak

+0

また、 'threadId'の型は何ですか?おそらく、それをダブルからキャストする必要はありません。 – zneak

+0

番号を書き留める計画はありますか?それが数字の量を増やすなら、ファイル内の後のすべてが一緒にシフトする必要があります。たとえば、99 - > 100の場合は3桁のスペースが必要ですが、前のスペースは2桁です。 –

答えて

2

atoiは通常の整数です。 1つのコメンターによって示唆されるように

//long long id = atoll("12345678901"); 
long long id = _atoi64("12345678901"); // for Visual Studio 2010 
id++; 
// write back to file here 

ato*機能の代わりにstrtollを使用します:そこatolatollは、(Windowsの場合_atoi64)もあります

char * data = "12345678901"; 
long long id = strtoull(data, NULL, 10); 
id++; 

あなたがCを使っているので++ここで、あなただけのはずfstreamから直接引き出します。

long long id; 
{ 
    std::ifstream in("numberfile.txt"); 
    in >> id; 
} 
id++; 
{ 
    std::ofstream out("numberfile.txt"); 
    out << id; 
} 
+0

@PeterWood std :: ifstreamとstd :: ofstreamはバイナリではなく長いテキスト形式で読み書きします。 – Greyson

+0

ストリームから直接読み込んだ場合、ファイル内の数字「12345678901」は私の 'long' varに' -858993460'となります。 'atol'を使うと' 2147483647'という数字になりますが、これも間違っています。 –

+0

@juergendこの長い問題を解決するには、long-long(編集時)を使用してください。数字がどれくらい大きくなるかによっては、単一のネイティブタイプを使用して運が悪くなるかもしれません。 – Greyson

2

C文字列(char配列)は、次のように使用します。

long id = atol("12345678901"); 

これで数字を増やすことができます。次に、C++ std::stringからlongから行くために、これを使用する:

std::ostringstream oss; 
oss << id; 
std::string idAsStr = oss.str(); 

は今、あなたは戻って文字列をファイルに書き込むことができます。

+0

'atol'を使用すると、数字「2147483647」が不正確になります。 –

+0

プラットフォームによって異なります。 Mac OS Xでは 'atol'は正しい値を返しますが、私のシステムでは' long'は8バイト幅です。単に 'sizeof(long)'を出力するだけで、システム上で 'long 'の幅を確認することができます。不正な値を取得したり、バイト幅が小さすぎたりする場合は、 'long long'に切り替え、代わりに' atoll'を使用してください。 –

+0

'atoll'はVisual Studio 2010では見つかりませんでした。: –

1

Boost.Lexical_Castにアクセスできますか?

double id = boost::lexical_cast<double>("some string"); 
++id 
std::string id_string = boost::lexical_cast<std::string>(id); 

現在のところ、現在のファイル転送を使用してください。