Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-07-2012, 13:24   #1
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
[C++]:Devo scrivere su un file esterno

Ciao a tutti ragazzi
ho queste due classi Veicolo e Automobile che eredita in maniera pubblica da Veicolo le funzioni che vengono ridefinite in questa classe automobile.
E la funzione write_data deve scrivere le info su un file esterno.
Le classi hanno stringhe dinamiche.
Vi posto ciò che ho scritto per inquadrare il problema ma il vero mio dubbio è l'ultima finestra di codice.


Codice:
#ifdedine veicoli_h_
#define veicoli_h_

#include <iostream>
#include<ostream>
#include <string>
using namespace std;

class Veicolo
 {  
    private:

     string *Marca;
     string *Proprietario;
     
   public:
    Veicolo( string & mar, string &prop);
    ~Veicolo() {delete []Modello; delete []Proprietario};
   virtual void print_data();
   virtual void write_data();
};


class Automobile: public Veicolo
{
     private:
      string *Modello;
      string *Targa;
      int Cilindrata;
    
    public:
   
Automobile(string & mar, string &prop , string &mod, string&tar, int cil = 0);
       ~Automobile() {delete []Modello; delete []Targa;};
       virtual void print_data();
       virtual void write_data()

       }

#endif
vado ad implementare

Codice:

include "veicoli.h"
Veicolo::Veicolo ( string & mar, string &prop)
{Marca = new string(mar);
 Proprietario = new string (prop);}



Automobile::Automobile  (string & mar, string &prop , string &mod, string&tar, int cil = 0) 
{
Modello = new string(mod);
 Targa = new string (tar);
   Cilindrata=cil;
}


void Veicolo::print_data(){
cout<<"marca è =" <<Marca;
cout<<"proprietario è="<<Proprietario;}

void Automobile::printa_data(){
Veicolo::print_data();
cout<<"modello" <<Modello;
cout<<"targa"<<Targa;
cout<<"cilindrata"<<Cilindrata;
}



fin qui mi trovo alla perfezione l'ho postato solo per far inquadrare il problema.
Dovrei ora stampare su un file esterno le info, per esempio su testo.txt, tramite le funzioni write_data(). questo file di testo l'ho salvato dove, ho salvato questo codice.
Da quello che ho capito per stampare una cosa devo innanzitutto considerare una libreria di uscita tipo ostream o ofstream, andando ad includere nel codice come ho fatto all'inizio.
Poi devo assegnare uno stream al file che voglio usare (testo.txt)
quindi devo fare
Codice:
void Veicolo::write_data(){

ostream fd;   //fd è lo stream del file 
fd.open ("testo.txt",ios::out|ios::app)    

 //in modo da poter scrivre sul file senza andar a cancellare le cose che scrivo

fd<<"Marca"<<Marca;
fd<<"Proprietario"<< Proprietario;
}

void Automobile::write_data()
{  Veicolo::write_data();
   fd<<"Modello"<<Modello;

      fd<<"targa"<<Targa;
         fd<<"cilindrata"<<Cilindrata;

}
ho fatto bene?
che devo fare più per far scriveere le info su questo file esterno?
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2012, 13:54   #2
LarsSalazar
Junior Member
 
Iscritto dal: Oct 2008
Messaggi: 21
non vedo nel codice la chiusura del file.

I comandi per la scrittura sono quelli da te descritti qui un breve esempio:
Codice:
// basic file operations
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream afile;
  afile.open ("esempio.txt");
  afile << "Scrivo qualcosa sul file!\n";
  afile.close();
  return 0;
}
L'outuput è questo:
[file esempio.txt]
Scrivo qualcosa sul file!
LarsSalazar è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2012, 16:27   #3
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
c'è differenza tra ostream e ofstream a livello di programma?

Quote:
Originariamente inviato da LarsSalazar Guarda i messaggi
non vedo nel codice la chiusura del file.

I comandi per la scrittura sono quelli da te descritti qui un breve esempio:
Codice:
// basic file operations
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream afile;
  afile.open ("esempio.txt");
  afile << "Scrivo qualcosa sul file!\n";
  afile.close();
  return 0;
}
L'outuput è questo:
[file esempio.txt]
Scrivo qualcosa sul file!
Ciao Lars

e la chiusura che tu dici la devo porre, al termine delle due funzione write_data?


per fare una cosa del genere devo porre qualcosa nel costruttore?
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2012, 18:31   #4
bender86
Member
 
L'Avatar di bender86
 
Iscritto dal: Mar 2008
Messaggi: 47
Quote:
Originariamente inviato da Bandit Guarda i messaggi
Le classi hanno stringhe dinamiche.
Perché?
Modello, marca, targa e proprietario sono semanticamente stringhe. Perché tu le rappresenti come puntatori a stringa? Hai un buon motivo? Usare dei puntatori introduce la possibilità di fare errori nella loro gestione*, proprio per questo in C++ si usano il meno possibile.

* Errori che hai fatto tra l'altro. L'istruzione 'delete [] variabile;' ha senso solo se 'variabile' è un array, cioè se è stato allocato con 'new Tipo[dimensione];'. Ma non lo è, dato che lo hai allocato con 'new Tipo;'. Devi usare 'delete variabile;'. Anzi, devi evitare i puntatori.

Un altro errore sono gli argomenti dei costruttori: devi passare riferimenti a stringhe costanti:
Codice:
Veicolo(const string & mar, const string & prop);
Per la tua domanda, il modo più semplice è di passare un argomento di tipo 'std::ostream &' alle tue funzioni 'write_data()'. In questo modo possono scrivere su qualsiasi stream, compreso 'cout', quindi puoi implementare 'print_data()' usando 'write_data()'.

Codice:
...
   virtual void print_data();
   virtual void write_data(std::ostream & stream);
...
Codice:
void Veicolo::print_data() {
    // Chiama 'write_data()', che scrive su uno stream qualsiasi,
    // e fagli scrivere su 'cout' (la console).
    write_data(std::cout);
}

void Veicolo::write_data(std::ostream & stream) {
    stream << "Marca: " << Marca << '\n';
    stream << "Proprietario: " << Proprietario << '\n';
}

void Automobile::print_data() {
    // Chiama 'write_data()', che scrive su uno stream qualsiasi,
    // e fagli scrivere su 'cout' (la console).
    write_data(std::cout);
}

void Automobile::write_data(std::ostream & stream) {
    Veicolo::print_data(stream);

    stream << "Modello: " << Modello << '\n';
    stream << "Targa: " << Targa << '\n';
    stream << "Cilindrata: " << Cilindrata << '\n';
}
A quel punto chiami quelle funzioni passando uno stream come parametro:

Codice:
int main()
{
    std::ofstream file;
    file.open("esempio.txt");
    
    Automobile auto("Ford", "Mr. Ford", "T", "TTT000");
    
    // Stampa sulla console, usando 'cout'.
    auto.print_data();
    
    // Stampa sulla console, usando 'cout' (uguale a prima).
    auto.write_data(std::cout);
    
    // Stampa nel file 'esempio.txt'.
    auto.write_data(file);
    
    file.close();
}
bender86 è offline   Rispondi citando il messaggio o parte di esso
Old 27-07-2012, 19:00   #5
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
Ciao Bender

perchè il testo mi diceva che erano delle stringhe dinamiche, e poichè non le avevo mai incontrate ho aperto una discussione

http://www.hwupgrade.it/forum/showthread.php?t=2490286

ed infatti l'implementazione ricorda la soluzione che mi ha mostrato Kendal
quindi a questo punto non so come creare classi con stringhe dinamiche



ma questo std:: lo posso evitare di scrivere se metto sopra a tutto
using namespace std?
non l'ho mai visto nemmeno sul libro quel comando e seppure mi rende le cose facili non lo riesco a capire
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
MacBook Neo sorprende iFixit: 'Non vedev...
Venus Optics presenta due nuovi obiettiv...
AMD pubblica una guida per eseguire Open...
Tomb Raider I-III Remastered arriva su A...
X fa marcia indietro: si adeguerà...
Framework e la crisi delle memorie: terz...
Doom è ovunque: perché il ...
NVIDIA aggiorna G-Sync Pulsar: migliorat...
Portatile gaming con RTX 5060 a 1.099€: ...
6G for dummies: al MWC 2026 il CEO di Qu...
Le RAM tornano a salire di prezzo: quest...
5 robot aspirapolvere bestseller al mini...
A 59 anni il mio primo hackathon: dieci ...
Come sfruttare le Offerte di Primavera p...
NVIDIA promette un salto enorme: path tr...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:06.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v