Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare
Realizzato da Lenovo e installato presso il Cineca di Casalecchio di Reno, Pitagora offre circa 44 PFlop/s di potenza di calcolo ed è dedicato alla simulazione della fisica del plasma e allo studio dei materiali avanzati per la fusione, integrandosi nell’ecosistema del Tecnopolo di Bologna come infrastruttura strategica finanziata da EUROfusion e gestita in collaborazione con ENEA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA
Rullo di lavaggio dei pavimenti abbinato a un potente motore da 28.000 Pa e a bracci esterni che si estendono: queste, e molte altre, le caratteristiche tecniche di Z60 Ultra Roller Complete, l'ultimo robot di Mova che pulisce secondo le nostre preferenze oppure lasciando far tutto alla ricca logica di intelligenza artificiale integrata
Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
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: 9431
[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: 9431
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: 9431
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


Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Mova Z60 Ultra Roller Complete: pulisce bene grazie anche all'IA Mova Z60 Ultra Roller Complete: pulisce bene gra...
Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Exynos 2600: temperature più bass...
Apple si ispirerà a Nothing? Back...
Da Intel ad AMD, il grande salto di Kulk...
Velocità 12 volte superiore a que...
Una piccola Morte Nera è gi&agrav...
Sei frodi che minacciano gli utenti nel ...
BioShock 4: Take-Two rassicura sullo svi...
Tesla, Musk promette FSD 'quasi pronto' ...
BioWare conferma: il nuovo Mass Effect &...
5 robot aspirapolvere di fascia alta in ...
Xiaomi Redmi Note 14 5G a 179€ è ...
Veri affari con gli sconti de 15% Amazon...
Tutti gli iPhone 16 128GB a 699€, 16e a ...
Take-Two ammette: vendite di Borderlands...
Tutti i Macbook Air e Pro con chip M4 ch...
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: 18:14.


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