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++ - Selezionare un file .txt e leggerlo
Forum - C/C++ - Selezionare un file .txt e leggerlo

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
oliverissimo (Normal User)
Newbie


Messaggi: 11
Iscritto: 14/05/2010

Segnala al moderatore
Postato alle 17:34
Lunedì, 14/06/2010
Ciao a tutti :)
Mi chiedevo come si puo' fare a scegliere un file .txt dalla stessa cartella dove si trova il sorgente e l'eseguibile, aprirlo e vedere cosa c'e' dentro.

Io sono abituato a sceglierlo da programma tipo:

Codice sorgente - presumibilmente Plain Text

  1. ifstream input;
  2. input.open ("input.txt");



Ma se dovessi scegliere il file da tastiera?

Es:

Scegli il file da aprire: ......txt

Il file contiene:

.... ....
.... ....

fine

Ringazio anticipatamente :)

PM Quote
Avatar
John (Ex-Member)
Pro


Messaggi: 191
Iscritto: 18/11/2007

Segnala al moderatore
Postato alle 18:00
Lunedì, 14/06/2010
semplicemente leggi dalla console il nome del file e passi quello come argomento a input.open:

Codice sorgente - presumibilmente C/C++

  1. char filename[64];
  2. printf("Inserici il nome del file da aprire: ");
  3. scanf("%s",filename);
  4. ifstream input;
  5. input.open (filename);


:k:

EDIT:
ricordati di chiedere all'utente di inserire anche l'estensione!

Ultima modifica effettuata da John il 14/06/2010 alle 18:03
PM Quote
Avatar
BlueWay (Normal User)
Rookie


Messaggi: 49
Iscritto: 21/03/2010

Segnala al moderatore
Postato alle 18:45
Lunedì, 14/06/2010
Testo quotato


Codice sorgente - presumibilmente C/C++

  1. char filename[64];
  2. printf("Inserici il nome del file da aprire: ");
  3. scanf("%s",filename);
  4. ifstream input;
  5. input.open (filename);




Questa soluzione presenta delle evidenti limitazioni:

1-utilizzo di array di char (esistono le stringhe)
2-utilizzo di printf (molto meno versatile rispetto a cout)
3-utilizzo di scanf (molto meno preciso di cin);


Se l'estensione del file non è gia nota, puoi usare questo codice:

Codice sorgente - presumibilmente C/C++

  1. string fn;
  2.         fstream file;
  3.         cout<<"Inserire nome file da aprire, completo di estensione =>";
  4.         cin>>fn;
  5.         file.open(fn.c_str(), ios::app);



Un fstream risulta più versatile di un ifstream, inquanto consente sia lettura che scrittura da/su file. La stringa consente una scrittura pressochè illimitata (un vector è sempre più versatile e potente di un array), nonchè l'utilizzo della funzione c_str(), che converte la nostra stringa in un array di char SOLO E SOLTANTO per la funzione open, senza mutare lo stato della stringa al di fuori di essa.

PS: qualora l'estensione fosse gia definita (es. tutti {txt}), potresti usare una formula del genere:
Codice sorgente - presumibilmente C/C++

  1. string fn;
  2.         fstream file;
  3.         cout<<"Inserire nome file da aprire=>";
  4.         cin>>fn;
  5.         fn += ".txt";
  6.         file.open(fn.c_str(), ios::app);




Ultima modifica effettuata da BlueWay il 14/06/2010 alle 18:47
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 0:17
Martedì, 15/06/2010
Testo quotato

Postato originariamente da BlueWay:
Questa soluzione presenta delle evidenti limitazioni:

1-utilizzo di array di char (esistono le stringhe)
2-utilizzo di printf (molto meno versatile rispetto a cout)
3-utilizzo di scanf (molto meno preciso di cin);




semplicemente è codice C, non C++ :)

PM Quote
Avatar
oliverissimo (Normal User)
Newbie


Messaggi: 11
Iscritto: 14/05/2010

Segnala al moderatore
Postato alle 3:33
Martedì, 15/06/2010
Ho adottato questa soluzione:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. void leggi_nome_file (char nome_file[11])
  6. {
  7.         do
  8.         {
  9.                 cout<<"Insrisci il nome del file da leggere: ";
  10.                 cin>>nome_file;
  11.                 if (nome_file != "compiti.txt") cout<<"\nNome di fail non valido. Prova
  12. ancora.\n\n"; // problema
  13.                 }
  14.                 while (nome_file != "compiti.txt");  // problema
  15.         }
  16.        
  17. void converti ( char in[11], char out[15] )
  18. {
  19.         int cifratura;
  20.         int b;
  21.         char c;
  22.        
  23.         ifstream input;
  24.         ofstream output;
  25.        
  26.         input.open (in);
  27.         output.open (out);
  28.  
  29.         cout<<"Inerisci cifratura: ";
  30.         cin>>cifratura;
  31.        
  32.         while (input.get(c))
  33.         {
  34.                 b=int(c)+cifratura;
  35.                 cout<<char(b);
  36.                 }                                                      
  37.        
  38.         input.close();
  39.         output.close();                                                
  40.         }
  41.        
  42.        
  43. void stampa_file ( char nome_file[15] )
  44. {
  45.         char c;
  46.        
  47.         ifstream output;
  48.         output.open (nome_file);
  49.        
  50.         while (output.get(c))
  51.         {
  52.                 cout<<char(c);
  53.                 }      
  54.                
  55.         output.close();                
  56.         }
  57.  
  58. int main()
  59. {
  60.         char FN [11];
  61.         char FC [15];
  62.        
  63.         leggi_nome_file(FN);
  64.        
  65.         cout<<"Inserisci il nome del file da scrivere: ";
  66.         cin>>FC;
  67.        
  68.         converti(FN,FC);
  69.        
  70.         stampa_file(FC);
  71.        
  72.         return 0;
  73. }



pero' mi da' un warning:


g++ -Wall -o "Esercizio 1 prof" "Esercizio 1 prof.cpp" (nella cartella: /home/silvius/Scrivania)
Esercizio 1 prof.cpp: In function ‘void leggi_nome_file(char*)’:
Esercizio 1 prof.cpp:11: warning: comparison with string literal results in unspecified behaviour
Esercizio 1 prof.cpp:13: warning: comparison with string literal results in unspecified behaviour
Compilazione terminata correttamente.

come mai?? :-|

Ps: Questo e' un programma che mi hanno dato da fare pre-esame che prende un file specifico in input (in questa caso: compiti.txt) e ogni lettera viene spostata di tot lettere al seconda del valore "cifratura".

Ad esempio:

File input ---> ciao

File output (cifratura 3) ---> fndr

:heehee:


PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 9:07
Martedì, 15/06/2010

Testo quotato


Codice sorgente - presumibilmente Delphi

  1. void leggi_nome_file (char nome_file[11])
  2. {
  3.     do
  4.     {
  5.         cout<<"Insrisci il nome del file da leggere: ";
  6.         cin>>nome_file;
  7.         if (nome_file != "compiti.txt") cout<<"\nNome di fail non valido. Prova
  8. ancora.\n\n"; // problema
  9.         }
  10.         while (nome_file != "compiti.txt");  // problema
  11.     }





oddio, questo è proprio un FAIL non valido!

non puoi confrontare gli array di caratteri in questo modo, lo puoi fare con le stringhe...

devi usare la funzione strcmp, che restituisce 0 se i due array di caratteri sono uguali.

PM Quote
Avatar
oliverissimo (Normal User)
Newbie


Messaggi: 11
Iscritto: 14/05/2010

Segnala al moderatore
Postato alle 15:51
Martedì, 15/06/2010
Hahahaha..grazie mille per l'aiuto Hedo :k:

Ecco il programma ora:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <fstream>
  3. #include <string.h>
  4. using namespace std;
  5.  
  6. void leggi_nome_file (char nome_file[11])
  7. {
  8.         do
  9.         {
  10.                 cout<<"Insrisci il nome del file da leggere: ";
  11.                 cin>>nome_file;
  12.                 if (strcmp (nome_file,"compiti.txt")!=0) cout<<"\nNome di fail non valido. Prova ancora.\n\n";
  13.                 }
  14.                 while (strcmp (nome_file,"compiti.txt")!=0);  
  15.         }
  16.        
  17. void converti ( char in[11], char out[15] )
  18. {
  19.         int cifratura;
  20.         int b;
  21.         char c;
  22.        
  23.         ifstream input;
  24.         ofstream output;
  25.        
  26.         input.open (in);
  27.         output.open (out);
  28.  
  29.         cout<<"Inerisci cifratura: ";
  30.         cin>>cifratura;
  31.        
  32.         while (input.get(c))
  33.         {
  34.                 if (int(c)>=65 && int(c)<=90)
  35.                 {
  36.                         b=int(c)+cifratura;
  37.                         if (b>90) output<<char(b-26);
  38.                     else output<<char(b);
  39.                         }
  40.                        
  41.                 if (int(c)>=97 && int(c)<=122) 
  42.                 {
  43.                         b=int(c)+cifratura;
  44.                         if (b>122) output<<char(b-26);
  45.                         else output<<char(b);
  46.                         }      
  47.                        
  48.                 else output<<char(c);
  49.                 }                                                      
  50.        
  51.         input.close();
  52.         output.close();                                                
  53.         }
  54.        
  55.  
  56. int main()
  57. {
  58.         char FN [11];
  59.         char FC [15];
  60.        
  61.         leggi_nome_file(FN);
  62.        
  63.         cout<<"Inserisci il nome del file da scrivere: ";
  64.         cin>>FC;
  65.        
  66.         converti(FN,FC);
  67.        
  68.         return 0;
  69. }



Adesso non mi da' errori :heehee:
Pero' c'e' un'altro problema :-o

Come ho detto prima questo programma prende un file .txt (compiti.txt) e sposta le sue lettere grazie a "cifratura", il tutto viene messo dentro un file creato da te.
Ora il mio problema e' concentrato qui:
Codice sorgente - presumibilmente Delphi

  1. while (input.get(c))
  2.         {
  3.                 if (int(c)>=65 && int(c)<=90)
  4.                 {
  5.                         b=int(c)+cifratura;
  6.                         if (b>90) output<<char(b-26);
  7.                     else output<<char(b);
  8.                         }
  9.                        
  10.                 if (int(c)>=97 && int(c)<=122) 
  11.                 {
  12.                         b=int(c)+cifratura;
  13.                         if (b>122) output<<char(b-26);
  14.                         else output<<char(b);
  15.                         }      
  16.                        
  17.                 else output<<char(c);
  18.                 }



Questo pezzo di codice fa' in modo che il programma legge ogni cosa che c'e' nel nostro file di input (compiti.txt), sposta ogni lettera e lo copia sul file di output.

il problema e' che quando vado a vedere il file di output le lettere in maiuscolo vengono stampate prima spostate e poi anche come erano prima.
Esempio:

File input:

Ciao!

File output (cifratura=5):

HCnft!

Invece dovrebbe uscire: Hnft!

Perche' mi fa' questo problema?
Come posso risolverlo? :-?





PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:29
Martedì, 15/06/2010
Ciao!
Ho letto la tua funzione, e a mio parere, devi modificare le condizioni if in questo modo:

determini se il carattere è una cifra o meno. - Usa la funzione isalpha( < carattere > )
(per maggiori informazioni: http://www.cppreference.com/wiki/c/string/isalpha)
Di conseguenza esegui la cifrature o meno.

Il problema, nel tuo caso, stà nell' ultima condizione else. In questo modo l' else si riferisce solo al secondo if.

PM Quote
Avatar
oliverissimo (Normal User)
Newbie


Messaggi: 11
Iscritto: 14/05/2010

Segnala al moderatore
Postato alle 21:34
Martedì, 15/06/2010
Ecco qua! il programma va' :love:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <fstream>
  3. #include <string.h>
  4. #include <cctype> //serve per l'isalpha
  5. using namespace std;
  6.  
  7. void leggi_nome_file (char nome_file[11])
  8. {
  9.         do
  10.         {
  11.                 cout<<"Insrisci il nome del file da leggere: ";
  12.                 cin>>nome_file;
  13.                 if (strcmp (nome_file,"compiti.txt")!=0) cout<<"\nNome di fail non valido. Prova ancora.\n";
  14.                 }
  15.                 while (strcmp (nome_file,"compiti.txt")!=0);  
  16.         }
  17.        
  18. void converti ( char in[11], char out[15] )
  19. {
  20.         int cifratura;
  21.         int b;
  22.         char c;
  23.        
  24.         ifstream input;
  25.         ofstream output;
  26.        
  27.         input.open (in);
  28.         output.open (out);
  29.  
  30.         cout<<"Inerisci cifratura: ";
  31.         cin>>cifratura;
  32.        
  33.         while (input.get(c))
  34.         {
  35.                 if (isalpha(c)!=0)   //isalpha(<carattere>) da' 0 quando e' una lettera dell' alfabeto
  36.                 {
  37.                         b=int(c)+cifratura;
  38.                         if (isalpha(char(b))==0) output<<char(b-26);
  39.                     else output<<char(b);
  40.                         }
  41.                        
  42.                 else output<<char(c);
  43.                 }                                                      
  44.        
  45.         input.close();
  46.         output.close();                                                
  47.         }
  48.        
  49.        
  50. void stampa_file ( char nome_file[15] )
  51. {
  52.         char c;
  53.        
  54.         ifstream output;
  55.         output.open (nome_file);
  56.        
  57.         while (output.get(c))
  58.         {
  59.                 cout<<char(c);
  60.                 }      
  61.                
  62.         output.close();                
  63.         }
  64.  
  65. int main()
  66. {
  67.         char FN [11];
  68.         char FC [15];
  69.        
  70.         leggi_nome_file(FN);
  71.        
  72.         cout<<"Inserisci il nome del file da scrivere: ";
  73.         cin>>FC;
  74.        
  75.         converti(FN,FC);
  76.        
  77.         cout<<"Il file di partenza contiene: \n";
  78.         stampa_file(FN);
  79.        
  80.         cout<<"Il file cifrato contiene: \n";
  81.         stampa_file(FC);
  82.        
  83.         return 0;
  84. }



Grazie mille a tutti!! :k:

Solo un'ultima cosa per Poggi Marco: c'e' una funzione che fa' la stessa cosa dell' isalpha ma con i caratteri da 48 a 57? ( numeri :rofl: )


Ultima modifica effettuata da oliverissimo il 15/06/2010 alle 21:35
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo