我对>>
运营商有疑问
我写了一个程序来计算二进制文件中的单词数
我的问题是关于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 example\n";
a.close();
b.open("newf.txt");
int c=0;
while(b>>w)
{
c++ ;
}
cout<<c;
b.close();
getch();
}
答案 0 :(得分:3)
默认情况下, ifstream 中的运算符&gt;&gt; 会忽略空格。如果要包含空格,则必须使用std :: noskipws操纵符标志,如官方文档here中所示。
答案 1 :(得分:1)
首先,您要摘录为char w[20]
不要这样做。如果提取超过20个字符的刺痛,则会发生坏事。而是使用string w
。
string::operator>>
是由b >> w
调用的内容:
表现为FormattedInputFunction。在构造和检查可能跳过前导空格的哨兵对象之后,首先使用
str
清除str.erase()
,然后从is
读取字符,并将它们附加到str
,就像{ {1}},直到满足以下条件之一:
- 读取N个字符,其中N为
str.append(1, c)
is.width()
,否则N为is.width() > 0
- 文件结束条件发生在流
中str.max_size()
is
对于std::isspace(c,is.getloc())
中的下一个字符c
为真(此空白字符保留在输入流中)。如果未提取任何字符,则
is
上会设置std::ios::failbit
,这可能会is
。最后,调用
std::ios_base::failure
取消os.width(0)
的效果,如果有的话。