2010-11-24 27 views
2

私のプログラム内で次のようなループが実行されており、私が受け取っている出力とデザインがどのように関連しているのか分かりません。私のforループが予想よりも多く実行されています

3 
DeviceName 
GPU 
Manufacturer 
Intel 
GraphicalRam 
128MB 

これはファイルDEVICELISTループにおいて

DeviceName=GPU 
Manufacturer=Intel 
GraphicalRam=128MB 

ある、no_of_linesは、この場合、ファイル内の行の数を指す:

cout << no_of_lines << endl; 
for (int count = 0; count < no_of_lines + 1; count ++) 
{ 
    getline(Device, line, '='); 
    cout << line << endl; 
} 

これが出力されます3.この出力は、ループが1行に1回だけ実行されるという検証として提供されています。誰がこのループが予想より多くの時間を実行しているのか教えていただけますか?私はそれがデリミネーターとして=を含めることが原因であると推測しています。ループが何らかの形で増分前の時間を実行していますが、最後の行でデリミネーターで停止する理由は、限界?

+0

http://www.cplusplusに従って。com/reference/iostream/istream/getline /あなたのコードは 'DeviceList.getline(line、255、 '=');'と読みます。何か不足していますか? – Mikhail

+0

出力がコードと入力と一致しません。あなたが私たちに見せていないことがあります。実行時に問題が示されるというコンパイル可能な例が必要です。私はあなたがこの例を作るときにあなた自身の問題を解決するだろうと確信しています。 –

+0

@Mikhail:いいえ、ストリーム、文字列、セパレータを取るstd :: getline()があります。これはあなたが(通常は)使用するべきものです(あなたのバージョンはバッファのサイズよりも小さい行を必要とし、痛みですそうでない場合は)を参照してください:http://www.cplusplus.com/reference/string/getline/ –

答えて

5

このhttp://www.cplusplus.com/reference/string/getline/はここにあなたの友達です。ドキュメンテーションによると、DELETM文字がgetlineに渡されると、それはDELEMに読み込まれます。charが見つかるか、ファイルの終わりに達します。 '\ n'は別々に扱われません。 DELETM charが見つかると、それは破棄され、まで読み込まれます。次にgetlineを呼び出すと、それはどこから残っているのかを読みとります。この場合、各呼び出しは次のように読み込まれます。

DeviceName 
GPU\nManufacturer 
Intel\nGraphicalRam 
128MB\n 

上記の文字列の '\ n'は、基本的に改行文字です。実際にバックスラッシュではなくn(2文字)で始まります。その単一の改行文字 '\ n'です。分かりやすくするために、私はそのように使いました。

わかりやすくするために、ここに完全なコード(コンパイルとテスト済み)を示します。

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    int no_of_lines = 3; 
    string line; 
    cout << no_of_lines << endl; 
    for (int count = 0; count < no_of_lines + 1; count++) 
    { 
     getline(cin, line, '='); 
     cout << line << endl ; 
    } 
    return 0; 
} 

これまでのところ、getlineを4回呼び出す必要がある理由がわかりました。

+0

ええ、今はすべて明らかです。私はコンパイラがそれを見た方法で '\ n'を考えていませんでしたが、それは別の文字にすぎません。どうもありがとう。 –

+0

Re:「実際には\ n」ではありません。文字通りバックスラッシュではなく、小文字のnであるが、改行文字は1つだけではないと思っていると思う。乾杯、 –

+1

これらのような場合の混乱を避けるため、 'cout <<"( "<< line <<")でデバッグしてください。 "<< endl; – Mikhail

0

あなたは3回カウントしますが、ループは0,1,2,3,4、つまり5回の繰り返しをカウントしています。

+0

+1匿名のドライブバイダウンダウンの正確かつ有用な情報です。 –

+0

それは5ではない、それは0から4未満だから、0,1,2,3 = 4回。 – Mikhail

+0

@Mikhail:hm、そうです。私は訂正した。 :-)それでも、ループが行数よりも多く実行されていることをOPに知っておくと便利です。 –

4

ループはno_of_lines+1回実行されます。

デリミタを '='にしたいとします。ただし、区切り文字が '='の場合、\nは区切り文字ではありません。従って、lineは、\n(例えば、第2のgetline)を含むことになる。したがって、表示される行数は、ループが実行される回数と同じではありません。

1

=をラインデリミタとして使用すると、\nではなく、がラインデリミタとして使用されます。

には、改行文字を含む文字列が入ります。

このような文字列を出力すると、2つ以上の行として表示されます(その行に含まれる改行によって)。

乾杯& HTH。、

関連する問題