PDA

Visualizza la versione completa : [C++] Posizionarsi su un file dopo N righe di testo


freetom
24-02-2011, 15:47
Avrei necessità di scendere... di 15 righe a partire dall'ultima e di estrapolare le restanti per un totale di 800 ca. L'ultima parte del problema sono in grado di farla ma non riesco a scendere... di 15 righe... :confused:

es...

riga900 <- l'estrapolazione delle precedenti 800 righe dovrebbe avvenire da qui...
riga901
riga902
riga903
riga904
riga905
riga906
riga907
riga908
riga909
riga910
riga911
riga912
riga913
riga914
riga915


Grazie

:ciauz:

lolide
24-02-2011, 21:11
In C++ quindi usi gli fstream ?
hai provato ad andare alla fine del file con fseek o seekg e andare indietro contando il numero di '\n' che trovi ?

freetom
25-02-2011, 18:34
Originariamente inviato da lolide
In C++ quindi usi gli fstream ?
hai provato ad andare alla fine del file con fseek o seekg e andare indietro contando il numero di '\n' che trovi ?

Riesco ad estrapolare le ultime righe volute con questo cod (del mitico oregon se non erro...):

Es. le ultime 500 righe le estrapolo così:




#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#define LINEE 500

int main()
{
ifstream f;
f.open("ESTRAZIONI-BARI.txt", ios::binary);

int ri=0;
f.seekg(-1, ios::end);
char c;
f.get(c);

//APRO FILE CON LE ULTIME RIGHE CHE INTERESSANO

ofstream fout;
fout.open("ESTRAZIONI-BARI-ULTIME-500.txt");


//---------------------------------------------

while(ri<LINEE)
{
if(c=='\n') ri++;
f.seekg(-2, ios::cur);
if(f.fail())
{
f.clear();
f.seekg(0, ios::beg);
break;
}
f.get(c);
}

string line;
getline(f, line);
getline(f, line);
while(!f.fail())
{

//scrivo su file ogni linea rilevata
fout << line;
fout << "\n";
//----------------------------------
cout << line << endl;
getline(f, line);

//cin.get();
}

f.close();

//return 0;
}




Ora però come ho scritto nel primo post avrei necessità di estrapolare le 520 ultime righe togliendo le ultime 20... il tutto in automatico (come posso togliere le ultime 20?)

E se possibile alla fine scomporre in 5 file distinti le diverse 5 "colonne" formate dai numeri intervallati da virgola...

es:

alla fine dei giochi...
il file contenente le righe...

a,b,c,d,e
f,g,h,i,l,

sarà scomposto in...

file1.txt contiene a e f
file2.txt contiene b e g
file3.txt contiene c e h
file4.txt contiene d e i
file5.txt contiene e e l

Grazie agli/alle esperti/e come lolide, oregon ecc...

:ciauz:

lolide
25-02-2011, 21:01
Usi seekg (http://www.cplusplus.com/reference/iostream/istream/seekg/) per andare alla fine del file (con fout.seekg(0, ios::end))

In un ciclo vai su di byte in byte, leggi il carattere con read (http://www.cplusplus.com/reference/iostream/istream/read/), e se il carattere letto corrisponde a '\n' incrementi un contatore con il quale ti tieni il conto dei '\n' trovati. Qudno il contatore arriva a 13 allora sei alla linea 13 ;)

Leggi la linea con fout.getline e fai quello che devi fare.

Loading