PDA

Visualizza la versione completa : [C++] Alcune domande sui file di testo, ci son cose che non capisco


Skull260287
06-04-2008, 17:03
Salve, come avrete capito dai miei ultimi post sul forum, mi sto cimentando nella gestione dei file di testo in c++, ma ci sono cose che non capisco.

Ad esempi, c' un modo per spostarmi si n righe, n parole o n caratteri all'interno del file in modo da non dover leggere dei dati che non sono necessari?


Grazie per l'aiuto e la comprensione.

andbin
06-04-2008, 17:30
Originariamente inviato da Skull260287
Ad esempi, c' un modo per spostarmi si n righe, n parole o n caratteri all'interno del file in modo da non dover leggere dei dati che non sono necessari?Parlando proprio in generale, l'unica che si pu fare per accedere in modo "casuale" a dei dati nel file fare un "seek" ad una certa posizione nel file.
Ma questo non vuol dire che ti sei mosso di N righe o N caratteri. Se un file di testo composto da righe di lunghezze diverse e non conosciute/determinate a priori, non puoi spostarti in modo arbitrario alla riga i-esima. Devi per forza leggerle in modo sequenziale.

Skull260287
06-04-2008, 17:45
Originariamente inviato da andbin
Parlando proprio in generale, l'unica che si pu fare per accedere in modo "casuale" a dei dati nel file fare un "seek" ad una certa posizione nel file.
Ma questo non vuol dire che ti sei mosso di N righe o N caratteri. Se un file di testo composto da righe di lunghezze diverse e non conosciute/determinate a priori, non puoi spostarti in modo arbitrario alla riga i-esima. Devi per forza leggerle in modo sequenziale.

Che storia! e per leggerle in modo sequenziale devo per forza utilizzare una variabile di appoggio nel programma in modo che il puntatore si sposti all'interno del file?

andbin
06-04-2008, 17:58
Originariamente inviato da Skull260287
per leggerle in modo sequenziale devo per forza utilizzare una variabile di appoggio nel programma in modo che il puntatore si sposti all'interno del file? Parlando sempre in generale, quando si apre un file e il sistema fornisce un "handle" per identificare il file, gi intrinseco l'utilizzo di un "puntatore" che indica la posizione corrente all'interno del file.

Skull260287
06-04-2008, 18:02
Originariamente inviato da andbin
Parlando sempre in generale, quando si apre un file e il sistema fornisce un "handle" per identificare il file, gi intrinseco l'utilizzo di un "puntatore" che indica la posizione corrente all'interno del file.

E come faccio a spostare questo puntatore, senza leggere, e quindi memorizzare in variabili interne al programma, il contenuto di alcune parti del file?

Un'altra cosa, se io ho un file che in un ciclo deve essere letto pi volte dall'inizio alla fine, come posso riportare il puntatore all'inizio del file, chiudendolo e riaprendolo?

mondobimbi
06-04-2008, 18:42
quando apri un file il suo contenuto non necessariamente scaricato in memoria, dipende dal tuo sistema operativo e la bufferizzazione dei dati che adotta.
Per muoverti all'interno del file senza leggerneil contenuto puoi usare la funzione seek con cui puoi andare all'inizio del file, avanti di tot caratteri, indietro etc.
Questo l'unico sistema senza scaricarti l'intero file, quindi se tu conosci la struttura interna del file puoi fare quello che chiedi, altrimenti non possibile.
Cerca con google "seek file c"
ciao
sergio

Skull260287
06-04-2008, 18:56
Originariamente inviato da mondobimbi
quando apri un file il suo contenuto non necessariamente scaricato in memoria, dipende dal tuo sistema operativo e la bufferizzazione dei dati che adotta.
Per muoverti all'interno del file senza leggerneil contenuto puoi usare la funzione seek con cui puoi andare all'inizio del file, avanti di tot caratteri, indietro etc.
Questo l'unico sistema senza scaricarti l'intero file, quindi se tu conosci la struttura interna del file puoi fare quello che chiedi, altrimenti non possibile.
Cerca con google "seek file c"
ciao
sergio

Grazie ho dato uno sguardo. Questo si pu fare se si utilizzi il tipo FILE e si definisce il file con puntatore. Ma se si ha un file cos definito:

ifstream file("studenti1.txt");



e ad un certo punto su questo file si effettua un ciclo per confrontarlo con un dato preso da un'altro file e raggiunta la fine del file devo riportare il puntatore all'inizio per preparare il file ad accettare un altro ciclo?

mondobimbi
06-04-2008, 19:07
se ricordo bene c' una funzione membro che si chiama seek che ha lo stesso comportamento
prova a cercare ifstream seek
ciao
sergio

mondobimbi
06-04-2008, 19:13
se ricordo bene c' una funzione membro che si chiama seek che ha lo stesso comportamento
prova a cercare ifstream seek
ciao
sergio

Skull260287
06-04-2008, 19:39
Originariamente inviato da mondobimbi
se ricordo bene c' una funzione membro che si chiama seek che ha lo stesso comportamento
prova a cercare ifstream seek
ciao
sergio

Grazie!! Ora sono riuscito a far tornare il puntatore all'inizio del file ma il programma su cui sto lavorando continua a non funzionare, quindi ho deciso di postarlo per darlo in pasto alle vostre menti immense rispetto alla mia, dal punto di vista della programmazione.

Ci sono dei controlli attivi all'interno del programma, utilizzati per cercare il punto dove si verifica il problema. Da quello che ho capito, pur riportando il valore del contatore a zero, legge correttamente il primo valore del file, ma non il secondo. Accetto consigli e critiche, non possono che migliorarmi.

Grazie in anticipo.


/*

Siano dati due file testo: studenti.txt e tesi.txt. Il primo contiene
informazioni riguardanti tutti gli studenti di un corso di laurea;
il secondo contiene informazioni riguardanti i soli studenti del medesimo
corso di laurea che hanno gi fatto richiesta della tesi.
Entrambi i file sono ordinati per numero di matricola crescente.
Scrivere una procedura che mostri a video la matricola e la media di
tutti gli studenti che hanno richiesto la tesi e che hanno svolto tutti gli esami.
*/

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(){

ifstream file("studenti1.txt"); fstream file1("tesi.txt");
int matric,matrict,sost,nnsost,voto,somma=0,nex=0;
char persona[30],personac[30],nomex[30];

if(!file){
file.open("studenti1.txt");
cerr<<"Impossibile aprire il file studenti1.txt"<<endl;
system("pause");
return -1;
}

if(!file1){
file1.open("tesi.txt");
cerr<<"Impossibile aprire il file tesi.txt"<<endl;
system("pause");
return -1;
}
while(!file.eof()){
file>>matric;
cout<<matric<<endl;
file>>persona;
cout<<persona<<endl;
file>>personac;
cout<<personac<<endl;
file>>sost;
cout<<sost<<endl;
file>>nnsost;
cout<<nnsost<<endl;
file1.seekp(0,ios::beg);
cout<<file1.tellg();
if(nnsost==0){
cout<<"Controllo"<<endl;
while(!file1.eof()){
file1>>matrict;
cout<<matrict;
file1>>persona;
file1>>personac;
if(matrict==matric){
for(int i=0;i<sost;i++){
file>>nomex;
file>>voto;
somma+=voto;
nex++;
}
cout<<matric<<" "<<(somma/nex)<<endl;
nex=0;
}
// system("pause");

}

//file1.close();

//file1.open("tesi.txt");
}

// cout<<"Controllo";

if(somma==0){
for(int i=0;i<sost;i++){
file>>nomex;
file>>voto;
}
}
somma=0;
}
file.close();
system("pause");
return 0;
}


I due files:

studenti1.txt


1209
Ferme Vincenzo
2 0
Informatica 28
Economia 23
1210
Fermi Vincenzi
2 0
Programmazione 28
Scienze 23


tesi.txt


1210
Fermi Vincenzi
1209
Ferme Vincenzo

Loading