Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1

    [C++] Alcune domande sui file di testo, ci son cose che non capisco

    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.
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C++] Alcune domande sui file di testo, ci son cose che non capisco

    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3

    Re: Re: [C++] Alcune domande sui file di testo, ci son cose che non capisco

    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?
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: Re: Re: [C++] Alcune domande sui file di testo, ci son cose che non capisco

    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5

    Re: Re: Re: Re: [C++] Alcune domande sui file di testo, ci son cose che non capisco

    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?
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  6. #6
    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

  7. #7
    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?
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

  8. #8
    se ricordo bene c'è una funzione membro che si chiama seek che ha lo stesso comportamento
    prova a cercare ifstream seek
    ciao
    sergio

  9. #9
    se ricordo bene c'è una funzione membro che si chiama seek che ha lo stesso comportamento
    prova a cercare ifstream seek
    ciao
    sergio

  10. #10
    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.
    codice:
    /*
    
    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
    codice:
    1209
    Ferme Vincenzo
    2 0
    Informatica 28
    Economia 23
    1210
    Fermi Vincenzi
    2 0
    Programmazione 28
    Scienze 23
    tesi.txt
    codice:
    1210
    Fermi Vincenzi
    1209
    Ferme Vincenzo
    MondoLibero: Informazione Libera, Varia ed Eventuale
    Sito di informazione varia ed eventuale. Quando ho voglia scrivo di ciò che mi pare. Pubblico guide, recensioni, notizie, critiche e tutto ciò che mi passa sotto mano e che penso sia interessante.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.