Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-07-2012, 12: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, 12: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, 15: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, 17: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, 18: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


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Samsung Galaxy S27 Ultra: un'importante ...
La rincorsa al fotorealismo è 'ol...
Super Smash Bros Melee arriva su Windows...
Xbox Game Pass, tante novità in a...
Samsung copierà Apple? Rincari in...
Google potrebbe rilasciare un'app uffici...
Lies of P, il sequel potrebbe chiamarsi ...
Dreamforce 2026: Salesforce punta sulla ...
SpaceX ha confermato che Flight 14 sar&a...
Googlebook pronto al debutto: Google apr...
Guida all'acquisto: quale lavapavimenti ...
Google Maps su Android Auto introduce fi...
AMD Ryzen 5 5500F: fino al 16% di presta...
L'ecosistema partner di Microsoft cresce...
Oracle registra un boom nella divisione ...
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: 08:07.


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