2017-05-15 5 views
-2

ファイルをループしていくつかの文字を抽出した後、何個の文字が抽出されたかを知るために質問があります。最初のものが抽出されます。ここで私はこれまで試してみましたです:文字の抽出後にファイル内の特定の場所に戻る

int get_length(ifstream &inp,int &length){ 
    int columns=0; 
    inp>>columns; 
    length++; 
    while(columns!=0) 
    { 
    inp>>columns; 
    length++; 
    } 
    if (!inp.good()) 
     inp.clear(); 

    inp.seekg(-length,std::ios::cur); 
    return length; 
} 

をそのバックと同じ長さを行っていないいくつかの理由、それは1で、それは間違っているなってきた、私は、それが機能Iドンを求める書き込み1で長さに追加しようとしましたここで何が間違っているのかわかりません、シーク機能を間違って使用しているのですか?

+0

コードは余分な時間を「長さ」に増やします。 'columns'に読み込まれた値がゼロであれば、' length'をインクリメントしないでください**。 –

+0

スキップされたスペースの数を考慮して 'length'をインクリメントしていますか? – Galik

+1

'std :: basic_istream :: tellg()'について読んでください。 –

答えて

0

私は問題がこれだと思っています: fstream 'inp'から整数値を読み込むたびに 'length'が増えています。整数表現の幅に応じて、その分だけ長さを増やす必要があります。その行と改行文字、およびfstreamの他の空白。

テストデータが含まれている場合:

10 
11 
12 
13 

を次にあなたが13を読ん時点で、あなたは、ファイルデータの12のバイトを消費しています。 カウンターは4回だけインクリメントされます。

あなたはあなたの関数の開始時に

auto const position_start = inp.tellg(); 

に電話をかけることによって、このより簡単かつ正確に行うことができ、あなたがデータを読み取るたら、あなたはと開始位置まで「巻き戻し」に興味を持っています')はifstream :: seekg(' basic_ifstream 'の特殊なので、

inp.seekg(position_start, std::ios::beg); 
+0

問題があったことに感謝し、空白のアイデアは私の頭の上を飛んできました –

0

'はifstream' に呼び出しバイト(文字)にオフセットをとります。しかし、フォーマットされた入力(intへの)は、入力を整数値に変換するときに、現在の位置を何バイト(0以上)だけ進めます。関数の先頭に 'ifstream :: tellg()'を使用して現在のファイル位置を取得し、 'seekg()'を呼び出して新しいファイル位置を取得する前に 'tellg()'を呼び出します。 2つの値の差は「長さ」になります。

関連する問題