读取输入文件时不会打印空格

时间:2011-07-11 20:46:27

标签: c++

我正在尝试读取输入文件的每个'char'并写入输出文件,直到找到'?'作为文件的结尾。除了单词之间的空格外,每个字符都写在输出文件中。我不知道这段代码有什么问题?

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
   ifstream infile("in.txt");
   ofstream outfile("out.txt");
   char ch;
   infile >> ch;
   while(ch != '?')
   {
     outfile<<ch;
     infile >> ch;
   }
}

4 个答案:

答案 0 :(得分:3)

尝试在阅读中使用noskipws

infile >> noskipws >> ch;

noskipws告诉输入流不要跳过它默认执行的空格。

答案 1 :(得分:1)

istream运算符>>忽略空格。试试这个:

std::string s;
std::getline(infile,s,'?');
outfile << s;

答案 2 :(得分:1)

&gt;&gt;输入流的运算符通常与解释相关联。例如,在阅读string时,它会跳过空格。阅读char时可能就是这种情况。 您应该使用read方法,例如:

infile.read(&ch, 1)

请参阅http://www.cplusplus.com/reference/iostream/ifstream/以获取参考资料

修改我忘记了get方法。这会让你成为一个角色,投射为intread方法更适合在一次调用中读取一大块数据。

答案 3 :(得分:0)

@Andrew White已经指出了如何解决你所看到的问题。我会抛弃我的想法(通常对我来说,可能是过度设计的)如何完成其​​余工作的想法:

#pragma once
#if !defined(SENTINEL_ITERATOR_H_)
#define  SENTINEL_ITERATOR_H_
#include <istream>
#include <iterator>

template <class T,
          class charT=char,
          class traits=std::char_traits<charT>,
          class distance = ptrdiff_t>

class sentinel_iterator :
    public std::iterator<std::input_iterator_tag,distance,void,void,void>
{
    std::basic_istream<charT,traits> *is;
    T value;
public:
    typedef charT char_type;
    typedef traits traits_type;
    typedef std::basic_istream<charT,traits> istream_type;

    sentinel_iterator(istream_type& s)
        : is(&s)
    { s >> value; }

    sentinel_iterator(T const &s) : is(0), value(s) { }

    const T &operator*() const { return value;  }
    const T *operator->() const { return &value; }

    sentinel_iterator &operator++() {
        (*is)>>value;
        return *this;
    }

    sentinel_iterator &operator++(int) {
        sentinel_iterator tmp = *this;
        (*is)>>value;
        return (tmp);
    }

    bool operator==(sentinel_iterator<T,charT,traits,distance> const &x) {
        return value == x.value;
    }

    bool operator!=(sentinel_iterator<T,charT,traits,distance> const &x) {
        return !(value == x.value);
    }
};

#endif 

然后代码变成这样:

#include <algorithm>
#include <fstream>
#include "sentinel_iterator.h"

int main() { 
    ifstream infile("in.txt");
    ofstream outfile("out.txt");

    infile >> noskipws;

    std::copy(sentinel_iterator<char>(infile),
              sentinel_iterator<char>('?'),
              std::ostream_iterator<char>(outfile));
    return 0;
}