Newsgroup: it.comp.lang.c++
Titolo: stream iterator

Salve,
	ifstream is( "src", ios::binary );
	ofstream os( "dst", ios::binary );
	copy( istream_iterator<char>( is ), istream_iterator<char>(),
		ostream_iterator<char>( os )
	);
mi copia il contenuto di un file nell'altro, ma toglie gli accapo.
-- src --
a
b
c
-- dst --
abc
Come posso evitarlo?
Grazie
(g++,linux)
-- 
int

 mi copia il contenuto di un file nell'altro, ma toglie gli accapo.
Hai provato a togliere ios::binary? Dovrebbe aprirlo in modalità testo.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 Hai provato a togliere ios::binary? Dovrebbe aprirlo in modalità testo.
Stesso risultato :(
-- 
int

 Stesso risultato :(
Infatti ho detto una stupidaggine. Comunque temo che senza un esempio
compilabile sarà ben difficile aiutarti.


 abc
Mi rispondo da solo: manca is >> noskipws dopo la creazione di is.
Inoltre, non mi ero accorto che, giustamente, oltre agli accapo toglieva
anche gli altri whitespaces.
Per chi chiede codice compilabile (corretto):
#include<iterator>
#include<algorithm>
#include<fstream>
int main () {
    using namespace std;
    ifstream is( "src" );
    ofstream os( "dst" );
    is >> noskipws;
    copy( istream_iterator<char>( is )
        , istream_iterator<char>()
        , ostream_iterator<char>( os )
    );
}
-- 
int

     ofstream os( "dst" );
      os << is.rdbuf(); // Mooolto piu' rapido che copiare
                        //   un carattere alla volta...
  }
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

                         //   un carattere alla volta...
Mi serve copiare un settore del file.
#include<iterator>
#include<fstream>
#include<iostream>
int main()
{
	using namespace std;
	typedef istream_iterator<char> it;
	ifstream is("src");
	is >> noskipws;	
	char b[] = "begin";
	it f1 = search( it( is ), it(), b, b + sizeof(b) -1 );
	char e[] = "end";
	it f2 = search( it( is ), it(), e, e + sizeof(e) -1 );
	cout << boolalpha;
	cout << (f1 != it()) << endl;
	cout << (f2 != it()) << endl;
	copy( f1, f2, ostream_iterator<char>(cout) );
}
Gli iteratore f1 e f2 vengono impostati correttamente, con un file
contenente begin e end nell'ordine giusto, ma la copia non va, non
stampa nulla nello stream di output. Che cosa sbaglio ? Gli iteratori
non dovrebbero essere isolati dallo stream sottostante ?
Saluti
-- 
int

 }
Questo esempio non č compilabile.


 Questo esempio non č compilabile.
Hai ragione. Per windows č servito #include<algorithm> per search().
Comunque credo che l'errore che ottengo derivi dal fatto di far
avanzare gli istream_iterator sullo stesso stream. Lo stream puo' avere
una sola posizione, gli iteratori non conoscono il loro contenitore,
quindi non possono ricordare la posizione del contenitore a loro
abbinato.
-- 
int

 abbinato.
Invece secondo me l'algoritmo std::search() richiede un forward iterator
e non un input iterator. Ma tieni presente che non sono per niente
sicuro che sia questa la causa. Comunque non sono riuscito assolutamente
a far funzionare std::search() con l'istream_iterator. Perņ questo, ad
esempio, pare funzionare:
std::istream_iterator < char > Iter( Stream );
std::istream_iterator < char > Eos;
std::istream_iterator < char > Pos = std::find( Iter, Eos, 'x' );
e mi trova (o meno) il carattere specificato.


 e mi trova (o meno) il carattere specificato.
std::find() scorre sequenzialmente il range e non ha quindi problemi.
Ciao,
Nicola

 std::find() scorre sequenzialmente il range e non ha quindi problemi.
Giusto.
