2016-08-26 20 views
-1

ここに初心者の間違いがあると確信していますが、私の人生にとってはそれを理解できません。C++ getline()は行末で停止しませんか?

getline()を使用して、2つのワード線(姓と名)を読み込み、名前を構造体のメンバーフィールドにソートしようとしています。しかし、getline()は、行末を過ぎて、次の行の最初の単語を、それが得られるはずの行の最後の単語に追加しているように見えます。

つまり、行の最後の単語を読み取ろうとすると、getline()はその単語と次の行の最初の単語を読み取っています。

入力ファイルの形式は次のとおりです。

シアトル・マリナーズ
Norichiki青木
セス・スミス
ロビンソン・カノ

ここに私のコードです:

struct Player { 
    string firstName; 
    string lastName; 
    float avg; 
}; 

struct Team { 
    Player roster[8]; 
    string teamName; 
}; 

Team home = {}; 
stringstream iss; 
string token; 
string lineread; 

while (getline(inFile, lineRead, '\n')){ 
    iss << lineRead; 
    if (getline(iss, token, ' ')) 
    { 
     if(s % 2 == 0) 
      home.roster[s/2].firstName = lineRead; 
     else 
      home.roster[s/2].lastName = lineRead; 
    } 
    s++; 
    cout << "token:" << token << endl; 
} 

出力私はgですettingは次のようになります。

トークン:シアトル
トークン:MarinersNorichiki
トークン:AokiSeth
トークン:SmithRobinson

しかし、私は

トークンを持っていると思いを:シアトル
トークン:マリナーズ
トークン:Norichiki
トークン:青木もっとこの代わりのようなものを試してみてください

+2

問題は 'getline()'の使用とは関係ありません。あなたが期待する出力は 'stringstream'演算子' << 'が前の内容をクリアすることを要求します。それはしません。 – Peter

+0

なぜgetlineを2回使用するのですか? 's'変数は何ですか? **すべての**関連コードを含めてください。ありがとうレミー。 –

答えて

0

struct Player { 
    string firstName; 
    string lastName; 
    float avg; 
}; 

struct Team { 
    Player roster[8]; 
    string teamName; 
}; 

Team home = {}; 
int s = 0; 
string line; 

while (getline(inFile, line)) 
{ 
    istringstream iss(line); 
    iss >> home.roster[s].firstName; 
    iss >> home.roster[s].lastName; 
    home.roster[s].avg = ...; 
    cout << "first: " << home.roster[s].firstName << ", last: " << home.roster[s].lastName << endl; 
    if (++s == 8) break; 
} 
+0

とても有難い –

0

のstd :: cin.getline()はstd :: cinを>で使用した場合の問題に実行することができます> var。

getlineは、第3引数 - 「停止」文字を提供することができます。この文字はgetl​​ineの入力を終了します。キャラクターが食べられ、ストリングが終了します。例: std :: cin.getline(str、100、 '|') std :: cin.getline()が指定されていない場合、第3引数として「停止」文字が改行に達したときに停止します。 は考える:

float fl; 
std::cin >> fl; 
char str[101] 
std::cin.getline(str, 101); 

そして、あなたが入力します。3.14

3.14はFLに読み込まれます。 3.14に続く改行はまだ入力バッファに置かれています。 std :: cin.getline(str、101)は、入力バッファにまだ残っている改行を直ちに処理します。 strは空の文字列になります。 アプリケーションがstd :: cin.getline()ステートメントを「スキップした」という錯覚があります。

解決策は、std :: cin.ignore()を追加することです。最初のstd :: cin文の直後。これは、入力バッファ(この場合は改行)から文字を取り出して破棄します。

のstd ::()3つの異なる方法cin.ignore呼ぶことができる。

  1. いいえ引数:単一文字を入力バッファから取り出され、廃棄される: のstd :: cin.ignore()。 // 1文字を破棄する
  2. 1つの引数:指定された文字数が入力バッファから取得され、破棄されます。 std :: cin.ignore(33); // 33文字を破棄する
  3. 2つの引数:指定された文字数を破棄するか、または指定された区切り文字を含む文字を破棄します。どちらか早い方を指定してください。 std :: cin.ignore(26、 '\ n'); // 26文字を無視するか、改行するかのどちらか早いほうにする
関連する問題