2011-09-13 6 views
0

私はテキストファイル内の位置をジャンプできるかどうか疑問に思っていました。 このファイルがあるとします。アドバンスファイルファイル内の数字をスキップするポインタ

12 
8764 
2147483648 
2 
-1 

私は何度もその私は3番目の数字に到達するたびにint.So 32ビットの最大数よりも多い、それは第二の上に読ん続けるので、それは読んでいないだろう第三の数を読み取ろうとするたびに。どのようにして4番目の番号にジャンプできますか?代わりに、オペレータの

+0

ですか? –

答えて

6

使用のstd :: getlineの>>(STD ::はistream、int型)

std::istream infile(stuff); 
std::string line; 
while(std::getline(infile, line)) { 
    int result; 
    result = atoi(line.c_str()); 
    if (result) 
     std::cout << result; 
} 

理由あなたは、あなたが行動を経験しているが、そのときはstd ::のIStream試行(失敗した場合)整数で読み込むには、何かが間違っていることを意味する "badbit"フラグをセットします。そのbadbitフラグが設定されている限り、何もしません。だから、実際にその行で再読しているわけではなく、何もしておらず、そこにあった価値を残しています。あなたがすでに持っていたものと一直線に並んでいたいなら、それはおそらく以下のようなものです。上記のコードはよりシンプルで、エラーが発生しにくいです。

std::istream infile(stuff); 
int result; 
infile >> result; //read first line 
while (infile.eof() == false) { //until end of file 
    if (infile.good()) { //make sure we actually read something 
     std::cout << result; 
    } else 
     infile.clear(); //if not, reset the flag, which should hopefully 
         // skip the problem. NOTE: if the number is REALLY 
         // big, you may read in the second half of the 
         // number as the next line! 
    infile >> result; //read next line 
} 
+0

'atoi'はいつ' std :: string'のオーバーロードを受けますか? –

+0

私は本当にそれが欲しかったと思っています... –

+0

希望があれば... –

0

可能であれば、行を読み込んでから整数に変換することができます。ここにあなたのファイルの例です:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

int main() 
{ 
    std::ifstream in("file"); 
    std::string line; 
    while (std::getline(in, line)) { 
     int value; 
     std::istringstream iss(line); 
     if (!(iss >> value)) { 
      std::istringstream iss(line); 
      unsigned int uvalue; 
      if (iss >> uvalue) 
       std::cout << uvalue << std::endl; 
      else 
       std::cout << "Unable to get an integer from this" << std::endl; 
     } 
     else 
      std::cout << value << std::endl; 
    } 
} 
+0

私はistringstreamを考えました(より正確なので)。しかし、数字だけを持っているようだから、atoiを使う方が速くて簡潔です。彼が数字以上のものを持っているなら、これはより良い答えです。また、彼は署名された32ビット範囲の値だけを扱うように見えるので、内側の 'iss'を削除することができます。 –

0

std::getline()を使用する代わりに、あなたはstd::ios::clear()を呼び出すことができます。あなたはこれでそのコードを置き換えることができ、あなたのprevious question

fin >> InputNum; 

からこの抜粋を考えてみましょう:それは長い整数を使用するオプション

fin >> InputNum; 
    if(!fin) 
     fin.clear();