oliverissimo (Normal User)
Newbie
Messaggi: 11
Iscritto: 14/05/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 |
ifstream input;
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
|
|
John (Ex-Member)
Pro
Messaggi: 191
Iscritto: 18/11/2007
|
semplicemente leggi dalla console il nome del file e passi quello come argomento a input.open:
Codice sorgente - presumibilmente C/C++ |
char filename[64];
printf("Inserici il nome del file da aprire: ");
scanf("%s",filename);
ifstream input;
input.open (filename);
|
EDIT:
ricordati di chiedere all'utente di inserire anche l'estensione!
Ultima modifica effettuata da John il 14/06/2010 alle 18:03 |
|
BlueWay (Normal User)
Rookie
Messaggi: 49
Iscritto: 21/03/2010
|
Codice sorgente - presumibilmente C/C++ |
char filename[64];
printf("Inserici il nome del file da aprire: ");
scanf("%s",filename);
ifstream input;
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++ |
string fn;
fstream file;
cout<<"Inserire nome file da aprire, completo di estensione =>";
cin>>fn;
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++ |
string fn;
fstream file;
cout<<"Inserire nome file da aprire=>";
cin>>fn;
fn += ".txt";
file.open(fn.c_str(), ios::app);
|
Ultima modifica effettuata da BlueWay il 14/06/2010 alle 18:47 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
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++ |
|
oliverissimo (Normal User)
Newbie
Messaggi: 11
Iscritto: 14/05/2010
|
Ho adottato questa soluzione:
Codice sorgente - presumibilmente C++ |
#include <iostream> #include <fstream> using namespace std; void leggi_nome_file (char nome_file[11]) { do { cout<<"Insrisci il nome del file da leggere: "; cin>>nome_file; if (nome_file != "compiti.txt") cout<<"\nNome di fail non valido. Prova ancora.\n\n"; // problema } while (nome_file != "compiti.txt"); // problema } void converti ( char in[11], char out[15] ) { int cifratura; int b; char c; ifstream input; ofstream output; input.open (in); output.open (out); cout<<"Inerisci cifratura: "; cin>>cifratura; while (input.get(c)) { b=int(c)+cifratura; cout<<char(b); } input.close(); output.close(); } void stampa_file ( char nome_file[15] ) { char c; ifstream output; output.open (nome_file); while (output.get(c)) { cout<<char(c); } output.close(); } int main() { char FN [11]; char FC [15]; leggi_nome_file(FN); cout<<"Inserisci il nome del file da scrivere: "; cin>>FC; converti(FN,FC); stampa_file(FC); return 0; }
|
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
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
Codice sorgente - presumibilmente Delphi |
void leggi_nome_file (char nome_file[11]) { do { cout<<"Insrisci il nome del file da leggere: "; cin>>nome_file; if (nome_file != "compiti.txt") cout<<"\nNome di fail non valido. Prova ancora.\n\n"; // problema } while (nome_file != "compiti.txt"); // problema }
|
|
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. |
|
oliverissimo (Normal User)
Newbie
Messaggi: 11
Iscritto: 14/05/2010
|
Hahahaha..grazie mille per l'aiuto Hedo
Ecco il programma ora:
Codice sorgente - presumibilmente C++ |
#include <iostream> #include <fstream> #include <string.h> using namespace std; void leggi_nome_file (char nome_file[11]) { do { cout<<"Insrisci il nome del file da leggere: "; cin>>nome_file; if (strcmp (nome_file,"compiti.txt")!=0) cout<<"\nNome di fail non valido. Prova ancora.\n\n"; } while (strcmp (nome_file,"compiti.txt")!=0); } void converti ( char in[11], char out[15] ) { int cifratura; int b; char c; ifstream input; ofstream output; input.open (in); output.open (out); cout<<"Inerisci cifratura: "; cin>>cifratura; while (input.get(c)) { if (int(c)>=65 && int(c)<=90) { b=int(c)+cifratura; if (b>90) output<<char(b-26); else output<<char(b); } if (int(c)>=97 && int(c)<=122) { b=int(c)+cifratura; if (b>122) output<<char(b-26); else output<<char(b); } else output<<char(c); } input.close(); output.close(); } int main() { char FN [11]; char FC [15]; leggi_nome_file(FN); cout<<"Inserisci il nome del file da scrivere: "; cin>>FC; converti(FN,FC); return 0; }
|
Adesso non mi da' errori
Pero' c'e' un'altro problema
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 |
while (input.get(c)) { if (int(c)>=65 && int(c)<=90) { b=int(c)+cifratura; if (b>90) output<<char(b-26); else output<<char(b); } if (int(c)>=97 && int(c)<=122) { b=int(c)+cifratura; if (b>122) output<<char(b-26); else output<<char(b); } else output<<char(c); }
|
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?
|
|
Poggi Marco (Member)
Guru
Messaggi: 969
Iscritto: 05/01/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.
|
|
oliverissimo (Normal User)
Newbie
Messaggi: 11
Iscritto: 14/05/2010
|
Ecco qua! il programma va'
Codice sorgente - presumibilmente C++ |
#include <iostream> #include <fstream> #include <string.h> #include <cctype> //serve per l'isalpha using namespace std; void leggi_nome_file (char nome_file[11]) { do { cout<<"Insrisci il nome del file da leggere: "; cin>>nome_file; if (strcmp (nome_file,"compiti.txt")!=0) cout<<"\nNome di fail non valido. Prova ancora.\n"; } while (strcmp (nome_file,"compiti.txt")!=0); } void converti ( char in[11], char out[15] ) { int cifratura; int b; char c; ifstream input; ofstream output; input.open (in); output.open (out); cout<<"Inerisci cifratura: "; cin>>cifratura; while (input.get(c)) { if (isalpha(c)!=0) //isalpha(<carattere>) da' 0 quando e' una lettera dell' alfabeto { b=int(c)+cifratura; if (isalpha(char(b))==0) output<<char(b-26); else output<<char(b); } else output<<char(c); } input.close(); output.close(); } void stampa_file ( char nome_file[15] ) { char c; ifstream output; output.open (nome_file); while (output.get(c)) { cout<<char(c); } output.close(); } int main() { char FN [11]; char FC [15]; leggi_nome_file(FN); cout<<"Inserisci il nome del file da scrivere: "; cin>>FC; converti(FN,FC); cout<<"Il file di partenza contiene: \n"; stampa_file(FN); cout<<"Il file cifrato contiene: \n"; stampa_file(FC); return 0; }
|
Grazie mille a tutti!!
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 )
Ultima modifica effettuata da oliverissimo il 15/06/2010 alle 21:35 |
|