2010-11-22 6 views
0

次のコードに問題があります。私が期待しているのは、do-whileループを4回実行することです。これは、読み込んでいるテキストファイルの行ごとに1回ですが、実際には5回実行されているため、後でプログラムでセグメンテーションが発生します。ここで私は間違って何をしているのですか?余分な繰り返しを実行していますか?私はdo-whileを単純な0​​ループに置き換えようとしましたが、結果は同じです。このループは予想より多くの反復を実行しています

WirelessAdaptor 
GPU 
CPU 
Display 
+1

入力ファイルの最後に空白(特に空白行)はありませんか?デバッガを使って(あるいは単に 'cout')各ステップの' line'の値を調べます。 – suszterpatt

+0

.txtファイル( "表示")の4行目が改行/改行で終了しますか?もしそうなら、あなたは本当に余分な(空の)行を持っています。 – cbranch

答えて

1

eof()を無視する追加されましチェックはtrueを返しません。これは、getlineと呼び、最後の行を読むの後には行われません。あなたはeofが真であるかどうかを確認する必要がすぐにgetline呼び出しの後:

while(true) 
{ 
    getline(DeviceList, line); 
    if(DeviceList.eof()) 
    break; 
} 
+1

フレッドのバージョンはより優れており、eofだけではありません。 –

+0

合意。 'eof'をチェックすることは、ファイルの終わりに達することに特有の振る舞いがある場合に、より有益です。失敗した場合に例外をスローしたいが、たとえばeofで続行することができます。 –

+0

@ノア:私の編集までは空行を考慮していませんでした。 –

1

EOF()あなたがそこに残っている以上のデータを読み込もうとまではtrueを返しません。

int count = 0; 
string devices[4]; 
string line; 
ifstream DeviceList; 
DeviceList.open("devices/device_list.txt"); 
do 
{ 
getline(DeviceList, line); 
devices[count] = line; 
count ++; 
} while(!DeviceList.eof()); 

device_list.txtは、以下が含まれています。

0

上にgetline(DeviceList, line);を挿入してcout << line.length() << endl;を挿入し、何が起こるか教えてください。

5

私はあなたのループはおそらくより次のようになりますと思う:

編集:getlineは終わりを消費するまで、空の行に

while (getline(DeviceList, line)) 
{ 
    if (line.length() > 0) 
    { 
     devices[count] = line; 
     ++count; 
    } 
} 
0

あなたのテキストファイルは、おそらく最後の行の後に改行が含まれているため、ループが実際に終了する前getlineは空の文字列を読み込みます。

関連する問題