Telefonino.net network
 
| 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 » |

Torna indietro   WinTricks Forum > Software > Programmazione

Notices

Rispondi
 
Strumenti discussione
Vecchio 23-06-2004, 11.14.17   #1
frankieta
Newbie
 
Registrato: 01-05-2004
Messaggi: 16
frankieta promette bene
[C++] problemi con l'I/O su file

Ciao a tutti, ho una serie di problemi che mi
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
frankieta non è collegato   Rispondi citando
Vecchio 23-06-2004, 12.37.01   #2
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
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";
non si fa... devi usare "strcpy" oppure ricordarti di mettere il terminatore (ecco perché ti esce la schifezza dietro al "ciao")

Altre cose che ti succedono sugli stream sono dovuti alla priorità, vedi seguito.

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 23-06-2004, 12.46.44   #3
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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
LoryOne non è collegato   Rispondi citando
Vecchio 23-06-2004, 12.54.24   #4
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
'\0'

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 23-06-2004, 15.53.27   #5
pholcus
Linux Supporter
 
L'avatar di pholcus
 
Registrato: 02-12-2000
Loc.: Monza
Messaggi: 1.987
pholcus promette bene
Nn usare strcpy, ma strncpy..
pholcus non è collegato   Rispondi citando
Vecchio 23-06-2004, 16.02.22   #6
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Quota:
pholcus ha scritto:
Nn usare strcpy, ma strncpy..
.. Sorry

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 23-06-2004, 20.15.36   #7
LoryOne
Gold Member
WT Expert
 
Registrato: 09-01-2002
Loc.: None of your business
Messaggi: 5.505
LoryOne è un gioiello raroLoryOne è un gioiello raroLoryOne è un gioiello raro
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 ;)
}
Il programmino è buttato li, non vuole essere nulla di pretenzioso ma spero possa esserti utile.
Lascio ad altri volontari la spiegazione teorica che vorranno impartire sull'argomento
LoryOne non è collegato   Rispondi citando
Vecchio 24-06-2004, 11.27.58   #8
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
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
Il truncate ha precedenza sull'append, ogni classe ha una modalità d'apertura di default di cui ora ricordo parzialmente i parametri.

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
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 24-06-2004, 11.30.45   #9
P8257 WebMaster
Gold Member
 
Registrato: 07-01-2002
Loc.: Milano
Messaggi: 2.863
P8257 WebMaster promette bene
Accidenti alle faccine ...

ios:ut leggasi naturalmente

ios :: out ( senza spazi intermedi )

Bye
P8257 WebMaster non è collegato   Rispondi citando
Vecchio 24-06-2004, 12.59.51   #10
frankieta
Newbie
 
Registrato: 01-05-2004
Messaggi: 16
frankieta promette bene
Grazie a tutti, ragazzi!
frankieta non è collegato   Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is ON
Gli smilies sono ON
[IMG] è ON
Il codice HTML è OFF

Vai al forum

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

Orario GMT +2. Ora sono le: 16.50.34.


E' vietata la riproduzione, anche solo in parte, di contenuti e grafica.
Copyright © 1999-2017 Edizioni Master S.p.A. p.iva: 02105820787 • Tutti i diritti sono riservati
L'editore NON si assume nessuna responsabilità dei contenuti pubblicati sul forum in quanto redatti direttamente dagli utenti.
Questi ultimi sono responsabili dei contenuti da loro riportati nelle discussioni del forum
Powered by vBulletin - 2010 Copyright © Jelsoft Enterprises Limited.