Newsgroup: it.comp.lang.c++
Titolo: File sorting

Devo ordinare un file di testo di circa 100 MB composto da linee di questo
tipo:
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
34 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
in base al primo numero a sinistra di ogni riga, quindi l'esempio dovrà
diventare:
34 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
Date le dimensioni non posso caricarlo in memoria tutto, ma ho delle
difficoltà a scorrere il file.
Non ho particolari requisiti temporali.
Datemi un mano, per favore!

"Leonardo Anceschi" ha scritto
: Devo ordinare un file di testo di circa 100 MB composto da linee di questo

:
Potresti leggere il primo intero e l'offset dall'inizio del file di ogni
linea e metterli in un multiset. Dopo iteri su questo leggendo ogni linea
a partire dall'offset salvato e la copi in un altro file, piu` o meno:
#include <functional>
#include <fstream>
#include <string>
#include <set>
struct line_t
{
  typedef std::fstream::pos_type pos_t;
  bool operator > ( const line_t& rhs ) const
    { return key_ > rhs.key_; }
  int     key_;
  pos_t   off_;
};
std::istream& operator >> ( std::istream& in, line_t& l )
{
  l.off_ = in.tellg();
  in >> l.key_;
  in.ignore(10000, '\n');
  return in;
}
int main(int argc, char* argv[])
{
  using namespace std;
  typedef multiset<line_t, greater<line_t> > set_t;
  if ( --argc )
  {
    string name = argv[argc], cur_line;
    ifstream in( name.c_str() );
    istream_iterator<line_t> line_src(in), line_eof;
    set_t  lines( line_src, line_eof );
    name += ".sorted";
    ofstream out( name.c_str() );
    in.clear();
    for ( set_t::iterator i = lines.begin(), end = lines.end(); i != end;
++i )
    {
      in.seekg( i->off_ );
      getline( in, cur_line );
      out << cur_line.c_str() << '\n';
    }
  }
  return 0;
}
ciao
Massimo

 Massimo
massimo non ho molta pratica col C++ ma il ragazzo ha detto un file di
testo perciň i numeri sono caratteri, se tu leggi un int cosa succede?
forse si sta spiegando un po' troppo vagamente chi sta chiedendo...
bye duido
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 a partire dall'offset salvato e la copi in un altro file, piu` o meno:
Grazie per il suggerimento della copia in un altro file, era proprio quello
che cercavo!!!

Ti ringrazio anche per il codice, ma temo di non averci capito molto...
(conosci un link dove venga spiegata questa roba?!?!?!?!)
Cmq ho risolto in modo + artigianale.

 forse si sta spiegando un po' troppo vagamente chi sta chiedendo...
???

"Leonardo Anceschi"  ha scritto nel messaggio
:
: Ti ringrazio anche per il codice, ma temo di non averci capito molto...
: (conosci un link dove venga spiegata questa roba?!?!?!?!)
: Cmq ho risolto in modo + artigianale.
:
:
Puoi provare qui:
http://www.dinkumware.com/htm_cpl/set.html#multiset
http://www.sgi.com/tech/stl/multiset.html
http://www.roguewave.com/support/docs/SourcePro/stdlibref/multiset.cfm
ciao
Massimo

Datemi un mano, per favore!
Potresti per esempio wrappare tutti i primi indici e l'offset nel file
su un container associativo che mantenga ordinati gli elementi (quindi
std::multimap o std::multiset, tutto compreso nella libreria standard
di ogni compilatore che si rispetti),scorrere il container cercando
volta per volta ogni record e riscrivere tutto su un nuovo file.
Il Ghenio
---------
// TODO: Place your ass here