Scrivi su file in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’operatore fstream e << per scrivere su file
  2. Usa la funzione fstream e write per scrivere su file
  3. Utilizzare la funzione fwrite per scrivere su file
Scrivi su file in C++

Questo articolo spiegherà diversi metodi su come scrivere su un file in C++.

Usa l’operatore fstream e << per scrivere su file

Il file I/O in C++ è gestito utilizzando la classe fstream, che fornisce più metodi integrati per la manipolazione e il posizionamento del flusso. Una volta dichiarato l’oggetto fstream, possiamo chiamare la funzione open, passando il nome del file e la modalità con cui aprire il file come argomenti.

Quando si scrive su un file, si specifica la modalità std::ios_base::out, che corrisponde allo stato di apertura per la scrittura. Successivamente, controlliamo se il file è stato associato con successo all’oggetto stream, cioè la chiamata al metodo is_open nella condizione if. A questo punto, il file è pronto per ricevere input utilizzando l’operatore << ed elaborare l’output secondo necessità.

Si noti che il blocco else può essere utilizzato per scopi di registrazione degli errori, oppure è possibile implementare routine di gestione degli errori per una migliore esecuzione del programma a tolleranza di errore.

#include <fstream>
#include <iostream>

using std::cout;
using std::endl;
using std::fstream;
using std::ofstream;
using std::string;

int main() {
  string filename("tmp.txt");
  fstream file_out;

  file_out.open(filename, std::ios_base::out);
  if (!file_out.is_open()) {
    cout << "failed to open " << filename << '\n';
  } else {
    file_out << "Some random text to write." << endl;
    cout << "Done Writing!" << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

Done Writing!

Usa la funzione fstream e write per scrivere su file

Un altro metodo per scrivere su file è la funzione incorporata write che può essere chiamata dall’oggetto fstream. La funzione write accetta un puntatore a una stringa di caratteri e la dimensione dei dati memorizzati a quell’indirizzo. Di conseguenza, i dati forniti vengono inseriti nel file associato all’oggetto flusso chiamante.

Nel seguente esempio di codice, dimostriamo la segnalazione di errori minimi stampando lo stato della chiamata di funzione open, ma nelle applicazioni del mondo reale, richiederebbe una gestione delle eccezioni più robusta, documentata nella pagina di manuale.

#include <fstream>
#include <iostream>

using std::cout;
using std::endl;
using std::fstream;
using std::ofstream;
using std::string;

int main() {
  string text("Some huge text to write to\n");
  string filename2("tmp2.txt");
  fstream outfile;

  outfile.open(filename2, std::ios_base::out);
  if (!outfile.is_open()) {
    cout << "failed to open " << filename2 << '\n';
  } else {
    outfile.write(text.data(), text.size());
    cout << "Done Writing!" << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

Done Writing!

Utilizzare la funzione fwrite per scrivere su file

In alternativa, possiamo usare la funzione fwrite dal file in stile C I/O per scrivere nel file. fwrite ottiene i dati dal puntatore void e il programmatore è responsabile del passaggio del numero di elementi memorizzati a quell’indirizzo e della dimensione di ciascun elemento. La funzione richiede che il flusso di file sia di tipo FILE* e che può essere ottenuto chiamando la funzione fopen.

Notare che fwrite restituisce il numero di elementi scritti in un file quando l’operazione è riuscita.

#include <fstream>
#include <iostream>

using std::cout;
using std::endl;
using std::ofstream;
using std::string;

int main() {
  string text("Some huge text to write to\n");
  string filename3("tmp3.txt");

  FILE *o_file = fopen(filename3.c_str(), "w+");
  if (o_file) {
    fwrite(text.c_str(), 1, text.size(), o_file);
    cout << "Done Writing!" << endl;
  }

  return EXIT_SUCCESS;
}

Produzione:

Done Writing!
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C++ File