2009-05-16 9 views
0

現在、ファイルから各行を読み込み、特定の区切り記号を使ってその語から単語を抽出するプログラムを作成しています。最後の単語が読み込まれない

だから基本的に私のコードは私のコードは、行の最後の言葉を読んでdidnotしかし、この

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

using namespace std; 

int main(int argv, char **argc) 
{ 
    ifstream fin(argc[1]); 
    char delimiter[] = "|,.\n "; 
    string sentence; 

    while (getline(fin,sentence)) { 
    int pos; 
    pos = sentence.find_first_of(delimiter); 
    while (pos != string::npos) { 
     if (pos > 0) { 
      cout << sentence.substr(0,pos) << endl; 
     } 
      sentence =sentence.substr(pos+1); 
      pos = sentence.find_first_of(delimiter); 
     } 
    } 
} 

のように見えます。たとえば、私のファイルは次のようになります。 hello world

プログラムからの出力は "hello"という単語だけですが、 "world"ではありません。私はデリミタとして '\ n'を使用していますが、なぜdidnotは動作しますか?

ご了承ください。

+0

これはクラス割り当てのようです。 –

+0

明らかに実際のコードではありません - "文"の定義はどこですか? –

+0

私はこれを修正しましたが、将来は記述されているように動作するコードを投稿してください。最初に投稿したものはコンパイルされませんでした。あなたが話しているバグを示す作業コードを投稿すれば、時間を節約し、より速い答えを得ることができます。 –

答えて

2

getlineは、文字列に改行文字を保存しません。たとえば、ファイルに という行がある場合は、 "Hello World \ n" getlineはこの文字列を読み取ります "Hello World \ 0" コードは "World"を逃します。その文をIgonoring

が定義されていない、あなたはこのように動作するようにコードを変更することができます:

#include<iostream> 
#include<fstream> 
using namespace std; 

int main(int argv, char *argc) 
{ 
    ifstream fin(argc[1]); 
    char delimiter[]="|,.\n "; 
    while (getline(fin,sentence)) { 
    sentence += "\n"; 
    int pos; 
    pos = find_first_of(sentence,delimiter); 
    while (pos != string:: npos) { 
     if (pos > 0) { 
      cout << sentence.substr(0,pos) << "\n"; 
     } 
      sentence =sentence.substr(pos+1); 
      pos = find_first_of(sentence,delimiter); 
     } 
    } 
} 

注、私はビルに最後の区切り文字を追加するのトカゲよりエレガントなソリューションを借りました。以前のバージョンにはループ終了条件がありました。言い換えthis reference document

2

文字が区切り文字(\n)まで、抽出されたが、見つけ破棄され、残りの文字が返されます。

文字列が\nで終わらない場合は、^`hello world`$なので、デリミタまたは新しいposは見つかりません。

+0

この場合、行末を特定するために使用できる他の区切り文字はありますか? –

+0

か、getline以外のコードを使って\ nを読むことができますか?もしあれがあれば、それは何ですか? –

+0

私はあなたが記事からこれを逃したと思います。 'この文字を抽出したくない場合は、メンバー "get"を使用することができます。 – garrow

1

他の人が触れたように、getlineは最後に改行文字を返しません。コードを修正する最も簡単な方法は、getline呼び出し後に文の最後に1を追加することです。

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

using namespace std; 

int main(int argv, char **argc) 
{ 
    ifstream fin(argc[1]); 
    char delimiter[] = "|,.\n "; 
    string sentence; 

    while (getline(fin,sentence)) { 
    sentence += "\n"; 
    int pos; 
    pos = sentence.find_first_of(delimiter); 
    while (pos != string::npos) { 
     if (pos > 0) { 
      cout << sentence.substr(0,pos) << endl; 
     } 
      sentence =sentence.substr(pos+1); 
      pos = sentence.find_first_of(delimiter); 
     } 
    } 
} 
関連する問題