使用output
作为char数组打印一个单词加一个空格,但是使用单个char
打印输出与整个Affine.txt和适当的空格,你能告诉我为什么吗?
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ifstream myReadFile;
myReadFile.open("Affine.txt");
char output[500];
while(myReadFile >> noskipws >> output)
{
cout<<output;
}
myReadFile.close();
return 0;
}
输出:
Hola,
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ifstream myReadFile;
myReadFile.open("Affine.txt");
char output;
while(myReadFile >> noskipws >> output)
{
cout<<output;
}
myReadFile.close();
return 0;
}
输出:
Hola,Como estas?
TEST。
答案 0 :(得分:0)
使用char数组版本时,代码
while(myReadFile >> noskipws >> output)
使用此运算符:
template< class CharT, class Traits>
basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>& st, CharT* s );
此处的确切行为在此处http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2描述为
表现为FormattedInputFunction。在构造和检查可以跳过前导空格的哨兵对象之后,提取连续的字符并将它们存储在
s
指向其第一个元素的字符数组的连续位置。如果满足以下条件之一,则提取将停止:
- 找到空白字符(由
提取ctype<CharT>
facet确定)。不提取空白字符。st.width() - 1
个字符- 文件末尾出现在输入序列中(这也设置了eofbit)
在任何一种情况下,额外的空字符值
CharT()
都存储在输出的末尾。如果未提取任何字符,则设置failbit
(仍然会将空字符写入输出中的第一个位置)。最后,调用st.width(0)
取消std::setw
的效果,如果有的话。
这是一个很长的描述,但实质上是operator>>
的正常操作是一次读取一个单词,同时跳过任何介入的空白。
第一个单词&#34; Hola,&#34;会发生什么,它会在下一个空间读取和停止。
但是,在尝试阅读第二个单词时,您已经明确要求不使用noskipws
操纵器跳过任何空格。然后我们将这两个规则结合起来:
如果满足以下条件之一,则提取将停止:
- 找到空白字符(由
ctype<CharT>
facet确定)。 不提取空白字符。
和
如果未提取任何字符,请设置
failbit
因此,您已要求流不跳过空格。操作员在看到空格时停止读取,而根本不读取任何内容是错误情况。然后错误条件终止while循环。
所以这个组合不起作用!
如果你想在保留所有空格的同时读取整行输入,你可以使用std::getline函数,它读取包括空格在内的整行。
char output[500];
while(myReadFile.getline(output, sizeof output))
{
cout<<output;
}