Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] Puntatore di lettura e numero caratteri

    Ciao! Volevo chiedervi una piccola cosetta di C++.

    Quando io apro un file in C++ devo giustamente collegarlo a uno stream. Poi volendo posso spostare il puntatore di lettura (per i file in input). Il file che ho fatto deve (o dovrebbe) contare il numero di caratteri del file in oggetto, stampare quindi uno dopo l'altro i caratteri del file e poi riposizionarsi all'inizio per ulteriori operazioni:

    codice:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main (int argc , char* argv[]) {
       char c;
       int a=0;
       ifstream in(argv[1] , ios::binary);
       if (!in) {
          cout << "Errore";
          exit(1);
       }
       while (!in.eof()) {
          in.get(c);
          cout << c;
          a++;
       }
       cout << endl << a;
       in.seekg(0 , ios::beg);
       
       /*
       altre operazioni
       */
    }
    Il mio problema è il seguente: il numero di caratteri contato è sbagliato perchè in qualsiasi caso è sempre maggiore di uno rispetto al numero reale di caratteri del file e inoltre mi stampa inspiegabilmente per due volte l'ultimo carattere.

    Questo comunque (anche se si puù risolvere aggiungendo codice) è strano...infatti dovrebbe controllare se il prossimo carattere sia o meno l'EOF e se non lo è stamparlo. Avreste qualche idea migliore da suggerirmi? grazie



    Il problema maggiore ce l'ho dopo però. Se io voglio riportare la posizione di lettura all'inizio normalmente si usa la funzione seekg. Il problema è che se raggiungo nella lettura il carattere di EOF (come in questo caso) MISTERIOSAMENTE questa funzione SMETTE di funzionare e qualsiasi parametro gli dia, lascia sempre invariato il puntatore di lettura.

    Questa cosa però ho visto che non mi capita nei casi in cui il puntatore non sia giunto alla fine del file, e in pratica se sto ancora "puntando" a dei caratteri regolari posso muovermi liberamente utilizzando la suddetta funzione, mentre se arrivo alla fine non posso più farlo. Un esempio è nel seguente pezzo di codice:

    codice:
       while (1) {
          cin >> a;
          in.seekg(a , ios::cur);
          in.get(c);
          cout << c;
          in.seekg(-1 , ios::cur);
       }
    come potrete verificare, immettendo un quasiasi numero intero, verrà visualizzato il carattere del file dopo essersi spostati regolarmente del numero di posizioni immesse (sia in avanti che indietro) ma se immettete un numero tale da raggiungere la fine del file poi da li' non vi ci muovete più...provare per credere!

    In teoria potrei aggirare il problema chiudendo e poi riaprendo il file, ma mi sembra una cosa sbagliata o, quantomeno sconsigliabile.

    Come posso fare dunque per riportare all'inizio il puntatore di lettura anche nel caso io sia giunto alla fine del file?

    grazie infinite a chiunque mi riesca ad aiutare!

    Stefano

  2. #2
    Utente di HTML.it L'avatar di Yojimbo
    Registrato dal
    Nov 2003
    Messaggi
    104
    potrebbe essere un problema che hanno le tue librerie del C++ standard

  3. #3
    ah!
    bo mi sembra strano xkè ho scaricato l'ultima versione del devc++...

    cmq...a te funziona normalmente la funzione seekg() ?

  4. #4
    Utente di HTML.it L'avatar di Yojimbo
    Registrato dal
    Nov 2003
    Messaggi
    104
    non mi funzionano.
    seekg non può funzionare cosi, cerchi di indare oltre l'eof, se vuoi prelevareuno specifico carattere non devi usare ios::cur che modifica il puntatore allo stream dalla posizione in cui ti tovi. in c si userebbe SEEK_SET...

  5. #5
    difatti avevo provato anche nel seguente modo:
    codice:
    in.seekg(0 , ios::beg);
    ma non funziona ugualmente...

  6. #6
    Utente di HTML.it L'avatar di Yojimbo
    Registrato dal
    Nov 2003
    Messaggi
    104
    sorry, ma non posso aiutarti, non uso mai gli stream in C++ e non ho esperienza su questo, uso sempre e comunque le buon vecchie funzioni open,read,write e lseek

  7. #7
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    codice:
    #include <iostream>
    #include <string>
    #include <fstream>
    using namespace std;
    
    int main (int argc , char* argv[]) {
      
      ifstream in(argv[1] , ios::binary);
    
      if (!in) {
          cout << "Errore";
          exit(0);
       }
    
      string line;
    
      while(getline(in, line))
    	  cout << line << endl;
    
       in.seekg(0 , ios::beg);
       in.close();
    
       /*
       altre operazioni
       */
    
      return 0;
    }
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  8. #8
    grazie mille...non ho il devc++ sottomano quindi non posso provare, cmq appena posso ti so dire.

    Una cosa sola ti volevo chiedere xò...il modo in cui hai scritto il codice è uguale a come lo facevo io soloc he al posto di leggere CARATTERI, fai in modo che si leggano RIGHE. A questo punto non mi spiego perchè facendo getc() invece di getline() non funzioni...

    vabè non importa...grazie mille lo stesso!
    ciaociao!


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 © 2025 vBulletin Solutions, Inc. All rights reserved.