|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
23-06-2004, 11.14.17 | #1 |
Newbie
Registrato: 01-05-2004
Messaggi: 16
|
[C++] problemi con l'I/O su file
sta facendo impazzire non poco.. Allora: 1) Nell'I\O su file del C++ aprendo un file in modalità ios::ate dovrei poter preservare quello che c'è già scritto nel file, conservando la possibilità di modificare in una qualsiasi posizione del file. Ma come funziona veramente? #include <iostream> #include <fstream> using namespace std; void main() { char stringa[10] = "ciao"; char stringa2[10]; fstream stream("file.txt", ios::in | ios:ut | ios::ate |ios::app); stream.write((char *) &stringa, sizeof(stringa)); stream.read((char *) &stringa2, sizeof(stringa2)); cout << stringa2; } Se elimino ios::ate non cambia nulla. COSA IMPORTANTE: Non viene prodotto alcun file "file.txt" nella directory dove dovrebbe comparire se non specifico ios::app. Se aggiungo ios::app il file compare. Perchè? Tra l'altro l'output su schermo consiste in "ciao seguito da una serie di caratteri strani anche se il file non è aperto in modalità binaria (e anche aprendolo in mod binaria non cambia nulla) RIASSUMENDO: Io ho bisogno di scrivere su file dei record (strutture intere) che andranno poi recuperati dal programma e stampati a video.Ho bisogno anche di avere accesso diretto al file per modificare i singoli record e anche di aggiungere in coda (o in una posizione qualsiasi) altri record. Come si fa? Grazie a tutti e scusate la prolissità. Francesco |
23-06-2004, 12.37.01 | #2 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
Conto di risponderti più tardi in maniera più completa, se non lo farà qualcun'altro, per ora ti dico soltanto che il codice "abusa" un po' troppo della permissività del C/C++...
Codice:
char stringa[10] = "ciao"; Altre cose che ti succedono sugli stream sono dovuti alla priorità, vedi seguito. Bye |
23-06-2004, 12.46.44 | #3 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Punto 1
char stringa[10] = "ciao"; Ok e gli altri caratteri nel buffer non li conti ? Punto 2 stream.write((char *) &stringa, sizeof(stringa)); sizeof(stringa) è pari a 10. Giusto, infatti ti scrive 10 caratteri, i 4 giusti di ciao e gli altri a casaccio |
23-06-2004, 12.54.24 | #4 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
'\0'
Bye |
23-06-2004, 15.53.27 | #5 |
Linux Supporter
Registrato: 02-12-2000
Loc.: Monza
Messaggi: 1.987
|
Nn usare strcpy, ma strncpy..
|
23-06-2004, 16.02.22 | #6 | |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
Quota:
Bye |
|
23-06-2004, 20.15.36 | #7 |
Gold Member
WT Expert
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
|
Ho buttato giu due righe di codice.
Codice:
#include <fstream> #include <iostream> using namespace std; //L'aggiunta del carattere nullo \0 imposta la fine dell'array. char pluto[]="Pluto \0"; char pippo[]="Pippo \0"; char paperino[]="Paperino \0"; char minnie[]="Minnie \0"; char ch; const char *nfile="Prova.txt"; void premitasto(void) { cout << "\nPremi invio..."; cin.get(); } int contenuto(void) { //Devo solo effettuare una lettura del file. uso ifstream ifstream in(nfile,ios::in); //Un controllo da effettuare se vuoi far bene le cose if (!in) { cout << "non posso aprire il file." << endl; return 1; } cout << "\nContenuto di " << nfile << endl; //Finche non arrivo alla fine del file leggo un carattere alla volta while(in.get(ch)) cout << ch; cout << endl; premitasto(); } main(void) { char chr[sizeof(paperino)]; cout << "Ho definito 4 array di caratteri:" << endl; cout << "Pluto :" << pluto << endl; cout << "Pippo :" << pippo << endl; cout << "Paperino :" << paperino << endl; cout << "Minnie :" << minnie << endl; premitasto(); cout << "Creo un file di testo in streaming chiamato " << nfile << endl; cout << "che scrive il contenuto dei primi 3 array di caratteri"<< endl; premitasto(); //Qui devo scrivere sul file, quindi utilizzo ofstream ofstream out(nfile,ios::out); out << pluto << pippo << paperino; out.close(); contenuto(); cout << "Aggiungo l'ultimo array in coda al file..." << endl; premitasto(); //Ecco l'utilizzo dell'appending a fine file. ofstream out1(nfile,ios::app); out1 << minnie; out1.close(); contenuto(); cout << "Ora apro " << nfile << " con ios::ate ma sposto il puntatore"<< endl; cout << "all' inizio del file e cambio Pluto con Pippo." << endl; premitasto(); //Qui eseguo sia una lettura sia una scrittura su file. //Utilizzo quindi fstream.(Notare l'obbligo di utilizzare ios::in e ios::out) fstream out2(nfile, ios::in | ios::out | ios::ate); //Poichè dopo l'apertura, ios::ate si sposta a fine file... //...riporto il puntatore all'inizio out2.seekp(0,ios::beg); //...ed effettuo le modifiche. out2 << pippo; //E' meglio scaricare il buffer e rendere attive da subito le modifiche //effettuando un flushing dello stream buffer. out2.flush(); contenuto(); cout << "Leggo il secondo array di caratteri a cominciare dalla posiz. corrente:"; //Così come seekp pone il puntatore per la scrittura alla nuova posizione //seekg pone il puntatore per la lettura alla nuova posizione out2.seekg(sizeof(pippo)-2,ios::cur); //Leggo la giusta quantità di byte dal file out2 >> chr; //Chiudere lo stream è cosa giusta out2.close(); cout << chr; premitasto(); // E mo il file Prova.txt te lo cancelli da solo ;) } Lascio ad altri volontari la spiegazione teorica che vorranno impartire sull'argomento |
24-06-2004, 11.27.58 | #8 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
Utilizzare gli stream per operare su file...
Come da titolo, non mi soffermo in questo post sul concetto di "stream" e sulla logica di streaming in via generale, dato che questi dovrebbero essere ben conosciuti ad un programmatore C++, rivolgo la mia attenzione alle operazioni su file per quanti desiderano approfondire l'argomento. C++ ha implementazioni per gli stream che gestiscono ampiamente l'input e l'output da file di diversa natura (testo, binario ecc.), le seguenti classi che ereditano direttamente da uno stream sono basilari per operare sui file: - ofstream che eredita da ostream (outputstream) che consente di scrivere - ifstream che eredita da istream (inputstream) che consente di leggere - fstream derivata da iostream per leggere e scrivere. Non mi soffermo ulteriormente sulle funzioni, abbastanza chiare delle 3 classi, solo per citare che l'apertura avviene mediante la funzione membro 'open' void open(const cahr *, int) I flag che si specificano indicheranno il comportamento dello stream (come viesto nell'esempio di Lory e nell'esempio del post iniziale) - ios::in lo stream è in lettura (x input) - ios:ut lo stream è in scrittura (x output) - ios::trunc elimina il file se precedentemente esistente prima dell'apertura. - ios::binary crea un binary stream (equivale a mode "B") I flag sopra citati NON DETERMINANO arbitrariamente la posizione del puntatore sul file. - ios::ate lo stream punta alla fine del file (equivale a fseek(fp, 1, SEEK_END)) - ios::app lo stream punta alla fine del file ed esegue l'append dell'output Questi flag possono essere combinati (come già visto) attraverso l'operatore logico "OR" '|', se si vuole specificare più di un flag per la definizione delle modalità di apertura .. il concetto è identico all'utilizzo di funzioni stdlib come "fopen" od "open". ATTENZIONE a rispettare la precedenza logica degli operatori e a non eseguire l'override di essi ad esempio: Codice:
ios::trunc | ios::app Per evitare problemi di override come quello che influenza il codice che ha dato inizio al thread, consiglio di aprire lo stream con una clausola arbitraria come ios::app se si decide di fare l'append dell'output oppure semplicemente ios:ut e di agire successivamente sul puntatore muovendolo manulamente attraverso i metodi: seekg, seekp e tellg, tellp che recuperano ed agiscono direttamente sulla posizione del puntatore. Controllare lo stato dello stream penso tu lo sappia fare, in ogni caso un controllo con "bad" è vitale alla stabilità del programma. IMPORTANTE: Nonostante queste facilitazioni molti sembrano dimenticarsi che gli stream agiscono (come visto) su vere e proprie funzioni membro ed inizializzano oggetti che hanno una certa richiesta di memoria .. ricordarsi di chiudere il file, non solo per liberare la memoria usata, ma anche per distruggere lo stream e i puntatori ad esso associati. Spero di essere stato esauriente, l'esempio di Lory ti fornirà valide tracce per risolvere tecnicamente il problema dell'override. Bye P.S.: fp nella sintassi di fseek equivale alla dicitura di File Pointer per indicare un puntatore FILE generico. Ultima modifica di P8257 WebMaster : 24-06-2004 alle ore 11.37.42 |
24-06-2004, 11.30.45 | #9 |
Gold Member
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
|
Accidenti alle faccine ...
ios:ut leggasi naturalmente ios :: out ( senza spazi intermedi ) Bye |
24-06-2004, 12.59.51 | #10 |
Newbie
Registrato: 01-05-2004
Messaggi: 16
|
Grazie a tutti, ragazzi!
|
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
log di AVAST...che faccio ? | enry1 | Sicurezza&Privacy | 4 | 27-11-2008 19.38.09 |
Avvio XP lentissimo | sgarragagarru | Windows 7/Vista/XP/ 2003 | 8 | 20-05-2008 21.01.50 |
[Windows XP] Problemi con il masterizzatore DVD | Qgino | Hardware e Overclock | 13 | 16-10-2005 21.11.45 |
rallentamenti "anomali" | mikk76 | Windows 7/Vista/XP/ 2003 | 10 | 14-11-2004 19.59.09 |
computer da immondizzia | ziopazzo | Windows 9x/Me/NT4/2000 | 3 | 09-05-2004 01.20.30 |