为什么不用char数组打印整个.txt文件?

时间:2017-11-03 10:01:35

标签: c++ arrays char

使用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。

1 个答案:

答案 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;
}