2016-06-28 36 views
0

我有一個關於>>運營商的問題。
我寫了一個程序來計算二進制文件中的字數。
我的問題是關於while循環,不應該>>讀空間,進入循環,增加c,但只是不把任何東西放入w?
它給了我一個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的忽略空格。如果您想要包含空格,則必須使用std :: noskipws操縱符標誌,如官方文檔here中所示。

1

首先,你解壓到char w[20]不要這樣做。如果提取長於20個字符的刺痛會發生。請使用string w

string::operator>>是什麼,是由b >> w叫其將:

表現爲FormattedInputFunction。構造和檢查崗哨對象,其可以跳過前導空白後,首先清除strstr.erase(),然後從is讀取字符和它們附加到str彷彿str.append(1, c),直到滿足下列條件之一爲真:

  • N個字符被讀取,其中N是is.width()如果is.width() > 0,否則N是str.max_size()
  • 在流中發生結束文件的條件is
  • std::isspace(c,is.getloc())是真對01的下一個字符(這個空白字符保留在輸入流中)。

如果被提取沒有字符然後std::ios::failbit設置在is,這可能會引發std::ios_base::failure

最後,請致電os.width(0)取消std::setw(如果有)的影響。