2016-06-28 15 views
0

>>オペレータに関する質問があります。
バイナリファイルの単語数をカウントするプログラムを作成しました。
私の質問はwhileループについてですが、>>はスペースを読んではいけません。ループに入り、インクリメントCになりますが、何も入れないでください。
それは私に4の出力を与えますが、スペースを数えることは10ではありませんか?
ご協力いただければ幸いです。私のコードは以下の通りです:デフォルトではC++ - >>演算子はどのように動作しますか?

#include<iostream.h> 
#include<conio.h> 
#include<fstream.h> 
ofstream a; 
ifstream b; 
void main() 
{ 
    clrscr(); 
    char w[20]; 
    a.open("newf.txt",ios::binary); 
    a<<"This is an example\n"; 
    a.close(); 
    b.open("newf.txt"); 
    int c=0; 
    while(b>>w) 
    { 
     c++ ; 
    } 
    cout<<c; 
    b.close(); 
    getch(); 
} 
+3

(あなたが呼び出しているものも含めて) 'operator >>'の大部分のオーバーロード[先頭の空白をすべてスキップする](http://en.cppreference.com/w/cpp/concept/FormattedInputFunction)。 –

+0

これを認識しているかどうかはわかりませんが、廃止予定のヘッダーを使用しています。たとえば、「」の代わりに「」を使用する必要があります。 – buratino

+0

参照:http://en.cppreference.com/w/cpp/io/manip/skipws –

答えて

3

オペレータ>>はifstream では、空白を無視します。空白を含めるには、公式ドキュメントhereに示すように、std :: noskipwsマニピュレータフラグを使用する必要があります。

1

最初に、char w[20]に抽出しています。 20文字以上の刻みが抽出された場合、悪いことが起こります。代わりにstring wを使用してください。

string::operator>>は意志b >> wによって呼び出されるものである。

振る舞うFormattedInputFunctionとして。先頭の空白をスキップすることが歩哨オブジェクトを、構築し、確認した後、最初のstr.erase()strをクリアし、次のいずれかの条件が真になるまで、そして、str.append(1, c)によりisから文字を読み込み、いるかのようstrにそれらを追加:

  • Nの文字がそうでないNは、ファイル終了条件がストリームで発生しstr.max_size()
  • is
  • std::isspace(c,is.getloc())が01で次の文字cのために真である、Nはis.width()場合is.width() > 0であり、読んでいます(この空白文字は入力ストリームに残ります)。

何の文字が抽出されていない場合は、std::ios::failbitstd::ios_base::failureを投げる可能性がある、isに設定されています。

最後に、std::setwのエフェクトをキャンセルするには、os.width(0)を呼び出します(ある場合)。

関連する問題