Domanda [C++] Gestione file

Stato
Discussione chiusa ad ulteriori risposte.

luco88

Utente Silver
10 Ottobre 2008
27
3
0
63
Salve a tutti dovrei fare un esercizio che mi sta facendo dare di matto, praticamente dovrei poter leggere delle righe da un file e visualizzarne 20 successiivamente l'utente deve poter scegliere se andare alla "pagina successiva" e visualizzare quindi altre 20 righe.
Vi posto parte del mio codice:

Codice:
void visualizza_righe()
{
  FILE *fp;	
  //inizializzo l'array di char al carattere'\0'
  memset(stringa,'\0',sizeof(stringa));									
  char risp;
  //apertura del file
  fp = fopen("c:\\test\\prova4.txt","r");
  //controllo che il file esista
  if (fp == NULL)														
  {
    cout<<"File inesistente o danneggiato, impossibile aprire!\n\n";
  }
  cout<<"Verranno visualizzate 20 righe per volta\n\n";
  system("pause");
  do
  {
    
    for (int i = 0; i<20; i++)
	{
	  //effettiva lettura dal file
	  fread(stringa,1,1,fp);											
	  if (stringa != '\0')
	  {
	    temp[i] = stringa[i];
	  }
	  else if(stringa == '\0')
	  {	    
	    cout<<temp;
	  }
	}
	cout<<"Visualizzare altre righe?\n";
	cin>>risp;
  }while(risp != 'n' || risp != 'N');

  system("pause");
}

Please datemi una mano :'(
 
oltre al fatto che mancano le inclusioni delle librerie, mi pare un po' confuso come codice... manca la dichiarazione di temp, l'indice del for è sempre lo stesso ed ogni volta "sovrascrivi" quello che hai scritto in precedenza, quando controlli se il file esiste o meno (sicuro che se il file non esiste la funzione ritorni null?) anche se non esiste (il fatto che sia danneggiato c'entra ben poco) dopo aver stampato file inesistente prosegui l'esecuzione del programma... poi non comprendo il modo in cui controlli se il file è terminato... prima riempi l'array di '\0' (carattere di fine stringa) poi ad ogni iterazione se il carattere preso è \0, se non lo è copi il carattere in temp (in base a quale criterio hai deciso i nomi?), se invece controlli nuovamente se lo è (se è falso che a != b è ovvio che a=b) e poi stampi temp... inoltre penso che sia lecito rispondere ad una domanda come "Visualizzare altre righe?" con un "no" od un "No" piuttosto che con 'n' o 'N'...

inoltre è presente anche un'errore logico, infatti per come hai strutturato il programma te stamperesti (almeno vorresti stampare) 20 caratteri per volta, che potrebbero anche essere tutti caratteri di tabulazione...

dato che è un tuo esercizio e mi pare che tu ne abbia bisogno, non ti fornisco il codice necessario... prova a ragionare su quello che ti ho detto per trovare il modo giusto per affrontare il problema
 
Ultima modifica:
grazie per aver risposto innanzi tutto, allora premetto che l'unica libreria da includere è <iostream> e al massimo <string> non di più di questo sono sicuro; Poi per trovare il file ho utilizzato i puntatori fp è il mio file pointer di conseguenza se non trova il file al quale puntare punta a NULL; io sono già riuscito a visualizzare un intera riga di un file di testo ma non so come fare per visualizzarne 20! ci vorrebbe (forse) un fseek?, grazie intanto per la risposta e grazie per non aver postato il codice anche perchè chiedo aiuto non il codice :) grazie davvero.


P.S. sabato avrei il compito :(


EDIT:
Sono riuscito anche a leggere tutte le righe con questo codice

Codice:
while(!feof(fp))
{ 
  fread(stringa,1,1,fp);
}
cout<<stringa;

Rimane sempre il problema di visualizzarne solo 20 forse così andrebbe bene?:
Codice:
while(!feof(fp))
{  
  while(i<21)
 {
      fread(stringa,1,1,fp);
      i++;
  }
if  (i = 20)
{
 cout<<stringa<<endl;
}

}

P.S le variabili non dichairate erano state precedentemente dichiarate globalmente localmente solo stringa e fp :) grazie ancora dell'attenzione
 
non vorrei dirti troppo, ti dò un suggerimento... ogni riga è divisa dalle altre in un certo modo, dovresti saperlo... se non puoi prevedere quando inizierà la riga successiva, devi controllare ogni carattere e se vedi che inizia una nuova riga aumentare un contatore... quando hai ottenuto le 20 righe puoi stamparle e poi chiedere all'utente se cercarne altre...

se vuoi qualcosa di più esplicito dì pure...

cmq per curiosità (il prox anno inizierò informatica al triennio itis) i compiti di programmazione come avvengono? Il prof ti dà una specie di traccia e in un tempo limite devi scrivere il programma che faccia quanto richiesto?
 
Fatto... do una mano ho usato getline.
Se vuoi metto anche un link dove ho trovato quello che cercavo.
Se vuoi vederlo http://www.iprogrammatori.it/forum-...plus/leggere-una-riga-file-txt-con-t7556.html ... Poi da lì ci ricavi quello che ti serve.

Grazie ma purtroppo preferirei usare non il getline ma i comandi fopen fread e fwrite. Grazie cmq ^_^



non vorrei dirti troppo, ti dò un suggerimento... ogni riga è divisa dalle altre in un certo modo, dovresti saperlo... se non puoi prevedere quando inizierà la riga successiva, devi controllare ogni carattere e se vedi che inizia una nuova riga aumentare un contatore... quando hai ottenuto le 20 righe puoi stamparle e poi chiedere all'utente se cercarne altre..

cmq per curiosità (il prox anno inizierò informatica al triennio itis) i compiti di programmazione come avvengono? Il prof ti dà una specie di traccia e in un tempo limite devi scrivere il programma che faccia quanto richiesto?

Allora si il fine stringa è il carattere "\n" new line quindi quando incontra quel carattere potrei far incremantare un contatore giusto?

Per rispondere alla tua domanda il primo anno cioè il terzo di programmazione è davvero molto semplice per dirti la cosa più difficile saranno i puntatori e le funzioni delle stringhe strcpy e varie, nel quarto anno si comincerà con push e pop di pila (testa / coda) poi si fanno le liste poi gli archivi sempre in C/C++ poi si passa alla programmazione ad oggetti.

Successivamente al 5 anno di fa MySQL e php.

Cmunque i compiti iniziali ti verrà richiesto di fare un diagramma logico del problema che ti si presenta poi col tempo non ti verrà piu richiesto, successivamente ti verrà richiesto di fare delle funzioni apposite per risolvere dei problemi dovrai essere capace di spezzettare i problemi in sotto problemi ti ripeto per il terzo anno è una cavolata io facevo pascal da per me e me lo sono ritrovato ma quest'anno è durissima, cmq grazie dei consigli vedrò se riesco domani, grazie a tutti ;)
 
Risolto

Ragazzi ho risolto con l'utilizzo di tre cicli due while e un for allego il codice di soluzione :

Codice:
void leggi_righe()
{
    FILE *fp;
    char risp = '\0';
    memset(stringa,'\0',sizeof(stringa));
    fp = fopen("c:\\test\\test.txt","r");
    do
    {
    for(int i = 0; i<20 ; i++)
    {
      do
      {
        fread(stringa,1,1,fp);
        cout<<stringa;
      }
      while(stringa[0] !='\n');
    }
    cout<<"vuoi visualizzare altre pagine? ('s' = si ; 'n' = no)\n\n";
    cin>>risp;
    }while(risp =='s' || risp == 'S');
    fclose(fp);
    system("pause");
}

Grazie a tutti dell'aiuto :)
 
Grazie ma purtroppo preferirei usare non il getline ma i comandi fopen fread e fwrite. Grazie cmq ^_^

Allora si il fine stringa è il carattere "\n" new line quindi quando incontra quel carattere potrei far incremantare un contatore giusto?

Esatto proprio quello che intendevo ;)

Per rispondere alla tua domanda il primo anno cioè il terzo di programmazione è davvero molto semplice per dirti la cosa più difficile saranno i puntatori e le funzioni delle stringhe strcpy e varie, nel quarto anno si comincerà con push e pop di pila (testa / coda) poi si fanno le liste poi gli archivi sempre in C/C++ poi si passa alla programmazione ad oggetti.

Successivamente al 5 anno di fa MySQL e php.

Cmunque i compiti iniziali ti verrà richiesto di fare un diagramma logico del problema che ti si presenta poi col tempo non ti verrà piu richiesto, successivamente ti verrà richiesto di fare delle funzioni apposite per risolvere dei problemi dovrai essere capace di spezzettare i problemi in sotto problemi ti ripeto per il terzo anno è una cavolata io facevo pascal da per me e me lo sono ritrovato ma quest'anno è durissima, cmq grazie dei consigli vedrò se riesco domani, grazie a tutti ;)

Ok, grazie mille per le spiegazioni... mi aspettavo una cosa del genere...(sei in quarta giusto?)
cmq facci sapere se hai risolto, così possiamo chiudere, e se hai bisogno di altro chiedi pure
 
Esatto proprio quello che intendevo ;)



Ok, grazie mille per le spiegazioni... mi aspettavo una cosa del genere...(sei in quarta giusto?)
cmq facci sapere se hai risolto, così possiamo chiudere, e se hai bisogno di altro chiedi pure

Si sono in quarta cmq ti ho lasciato anch eun punto rep grazie davvero sei stato gentilissimo ;)
 
Stato
Discussione chiusa ad ulteriori risposte.