Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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 :)


640 Kb dovrebbero essere abbastanza per chiunque.

Un programma dieci volte più lungo è circa cento volte più complicato da scrivere.
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


Costruisci come se dovesse durare 1000 anni, vivi come se fosse l'ultimo giorno....

Linux user #510634
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: 2763
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++ :)


Ingegnere Informatico
https://ldlagency.it
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:



640 Kb dovrebbero essere abbastanza per chiunque.

Un programma dieci volte più lungo è circa cento volte più complicato da scrivere.
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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.


Ingegnere Informatico
https://ldlagency.it
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? :-?






640 Kb dovrebbero essere abbastanza per chiunque.

Un programma dieci volte più lungo è circa cento volte più complicato da scrivere.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 951
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.


Nulla va più veloce della luce, quindi rilassati.
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


640 Kb dovrebbero essere abbastanza per chiunque.

Un programma dieci volte più lungo è circa cento volte più complicato da scrivere.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo