2011-07-11 14 views
1

入力ファイルの各 '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; 
    } 
} 

答えて

3

noskipws読み取りに使用してみてください...

infile >> noskipws >> ch; 

noskipwsはそれがデフォルトでない空白をスキップしないために入力ストリームを伝えます。

+0

ありがとう@Andrewそれは動作します。私は質問がある>ファイルを読むのdeafault beahviorは "スペースをスキップする"場合は何ですか? – Alok

+0

@ Alok:緑色のチェックをクリックし、良いupvoteを与えることによって答えを受け入れることを忘れないでください:) –

+0

それはオレンジ色ではありません緑色を表示します) - – Alok

1

istreamオペレータ>>は空白を無視します。これを試してみてください:

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

または:そして、コードはこのような何かになり

#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 

:私は私の考え(一般的に私のために、おそらくオーバーエンジニアリング)は、ジョブの残りの部分を行う方法のアイデアに投げますよnoskipws(答えを参照)を使用してそれを伝えないでください。しかしgetlineはおそらくより速くなるでしょう。 –

+0

@Andrew:ああ、忘れてしまった。 –

1

入力ストリームの>>演算子は、一般に解釈に関連付けられます。たとえば、「string」と読むと、スペースはスキップされます。これは、charを読み込んだ場合に当てはまります。 次の例のように、readメソッドを使用するべきである:

infile.read(&ch, 1) 

を参照

編集私はget方法を忘れてしまったためhttp://www.cplusplus.com/reference/iostream/ifstream/を参照してください。それはあなたにintとしてキャストされた1文字を取得します。 readメソッドは、1回の呼び出しでデータの塊を読み取るために役立ちます。

0

@Andrew Whiteは、すでに見た問題を解決する方法をすでに指摘しています。

#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; 
} 
関連する問題