Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - LETTURA NUMERO DI RIGHE DA UN FILE .TXT, PROBLEMA CON FSTREAM.
Forum - C/C++ - LETTURA NUMERO DI RIGHE DA UN FILE .TXT, PROBLEMA CON FSTREAM.

Avatar
gian8 (Normal User)
Newbie


Messaggi: 9
Iscritto: 22/04/2013

Segnala al moderatore
Postato alle 1:09
Lunedì, 22/04/2013
Salve
sto creando questo programmino che deve leggere 2 file .txt
e poi successivamente confrontarli e mostrare le parole per cui differiscono.
mi è sorto un problema:

Utilizzando la prima volta la funzione bib(fstream &file,string s);
mi restituisce in modo esatto il numero di righe,
chiamando successivamente la funzione stampa(), non ricevo nulla sullo schermo.

se inverto l' ordine delle chiamate, prima chiamo stampa() e poi chiamo bib(),
mi stampa esattamente la matrice, ma mi stampa 0 per il numero di righe.

volevo delle delucidazione per questo comportamento penso legato alla funzione getline, che ancora un po' mi sfugge.

vi posto il codice da me utilizzato
Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cstring>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. void stampa(fstream &file);
  10. int bib(fstream &file,string s);
  11.  
  12. /*
  13.  *
  14.  */
  15. int main(int argc, char** argv) {
  16.  char file1[30],file2[30];
  17.  
  18.  string s,s1;
  19.  
  20.  
  21.     cout<<"inserire il nome del primo testo \n";
  22.     cin.getline(file1, 30);
  23.     cout<<"inserire il nome del secondo file da usare \n";
  24.     cin.getline(file2, 30);
  25.    
  26.     fstream file;
  27.     fstream filex;
  28.    
  29.    
  30.     file.open(file1 ,ios::in);
  31.     filex.open(file2,ios::in);
  32.    
  33.     if(!file)
  34.          cout<<"ERRORE FILE 1 \n";
  35.      
  36.    
  37.     if(!filex)
  38.       cout<<"ERRORE FILE 2\n";
  39.      
  40.    
  41.     cout<<"Righe 1 testo: "<<bib(file,s)<<endl;
  42.     cout<<"Righe 2 testo"<<bib(filex,s1)<<endl;
  43.  
  44.     stampa(file);
  45.     stampa(filex);
  46.    
  47. return 0;
  48. }
  49.  
  50.  
  51. void stampa(fstream &file)
  52. { string s;
  53.     while (file.good()) {
  54.         getline(file,s,' ');
  55.         cout<<s<<endl;
  56.     }
  57.    
  58.  
  59. }
  60.  
  61.  
  62. int bib(fstream &file,string s)
  63. {
  64.      int contarighe=0;
  65.         while(!file.eof()){
  66.                            getline(file,s,'\n');
  67.                            contarighe++;
  68.         }
  69.         return contarighe-1;
  70. }


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 10:35
Lunedì, 22/04/2013
Ciao!

La lettura di un file di testo avviene sequenzialmente. Di conseguenza, terminata la funzione bib, il puntatore del file si trova alla fine dello stesso.
Quindi, terminata la finzione di stampa o lettura, bisogna chiudere il file ed eventualmente riaprirlo.

PM Quote
Avatar
gian8 (Normal User)
Newbie


Messaggi: 9
Iscritto: 22/04/2013

Segnala al moderatore
Postato alle 11:51
Lunedì, 22/04/2013
Avevo intuito che potesse essere legato a una problematica di questo tipo, ti ringrazio per l attenzione.

PM Quote
Avatar
Saik (Normal User)
Pro


Messaggi: 117
Iscritto: 07/08/2011

Segnala al moderatore
Postato alle 18:41
Martedì, 23/04/2013
Senza aprire e richiudere il file sprecando piu' risorse del necessario potresti usare la funzione
Codice sorgente - presumibilmente Plain Text

  1. nomefile.seekg(0,nomefile.beg())


:D

PM Quote
Avatar
gian8 (Normal User)
Newbie


Messaggi: 9
Iscritto: 22/04/2013

Segnala al moderatore
Postato alle 16:58
Giovedì, 13/06/2013
ho letto ora, grazie non conoscevo questa funzione :)

PM Quote