c++ - >>操作员的工作

C++ - How does the >> operator work?

本文关键字:工作 操作员 c++      更新时间:2023-10-16

我有一个关于>>算子的问题。
我写了一个程序来计算二进制文件中的单词数。
我的问题是关于while循环的,难道>>不应该读取空格,进入循环,增加c,而不把任何东西放入w吗?
它给我的输出是4,但是算上空格不应该是10吗?
任何帮助都是感激的。我的代码如下:

#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   examplen";
    a.close();
    b.open("newf.txt");
    int c=0;
    while(b>>w)
    { 
        c++ ;
    }
    cout<<c;
    b.close();
    getch();  
}

默认情况下,ifstream中的运算符>>忽略空格。如果您希望包含空格,则必须使用std::noskipws操纵符标志,如官方文档所示。

首先,您将提取到char w[20] 不要这样做。如果提取的字符串长度超过20个字符,就会发生不好的事情。用string w代替。

string::operator>>b >> w所调用的,它将:

表现为FormattedInputFunction。在构造和检查哨兵对象(它可能会跳过前导空格)之后,首先用str.erase()清除str,然后从is读取字符并将它们像通过str.append(1, c)一样附加到str,直到以下条件之一为真:

  • 读取N个字符,如果is.width() > 0则N为is.width(),否则N为str.max_size()
  • 文件结束条件发生在流is
  • std::isspace(c,is.getloc())对于is中的下一个字符c为true(该空白字符保留在输入流中)。

如果没有提取字符,则std::ios::failbit设置在is上,这可能会抛出std::ios_base::failure

最后,调用os.width(0)来取消std::setw的效果,如果有的话。