Domanda

L'I / O del file C ++ è più duro dell'I / O del file C. Quindi, in C ++, la creazione di una nuova libreria per l'I / O dei file è utile o no? Intendo <fstream> Qualcuno può dire che ci sono dei vantaggi nell'I / O dei file C ++?

È stato utile?

Soluzione

PARERE

Non conosco nessun progetto reale che utilizza flussi C ++. Sono troppo lenti e difficili da usare. Esistono diverse librerie più recenti come FastFormat e Boost versione che afferma di essere migliore, c'era un pezzo nell'ultima rivista ACCU Overload su di loro. Personalmente ho usato la libreria c FILE negli ultimi 15 anni circa in C ++ e non vedo ancora alcun motivo per cambiare.

Velocità

Ecco un piccolo programma di test (busso velocemente insieme) per mostrare il problema di velocità di base:

#include <stdio.h>
#include <time.h>

#include<iostream>
#include<fstream>

using namespace std;

int main( int argc, const char* argv[] )
    {
    const int max = 1000000;
    const char* teststr = "example";

    int start = time(0);
    FILE* file = fopen( "example1", "w" );
    for( int i = 0; i < max; i++ )
        {
        fprintf( file, "%s:%d\n", teststr, i );
        }
    fclose( file );
    int end = time(0);

    printf( "C FILE: %ds\n", end-start );

    start = time(0);
    ofstream outdata;
    outdata.open("example2.dat");
    for( int i = 0; i < max; i++ )
        {
        outdata << teststr << ":" << i << endl;
        }
    outdata.close();
    end = time(0);

    printf( "C++ Streams: %ds\n", end-start );

    return 0;
    }

E i risultati sul mio PC:

C FILE: 5s
C++ Streams: 260s

Process returned 0 (0x0)   execution time : 265.282 s
Press any key to continue.

Come possiamo vedere, questo semplice esempio è 52 volte più lento. Spero che ci siano modi per renderlo più veloce!

NOTA: la modifica di endl in '\ n' nel mio esempio ha migliorato i flussi C ++ rendendolo solo 3 volte più lento dei flussi FILE * (grazie jalf ) potrebbero esserci dei modi per renderlo più veloce.

Difficoltà da usare

Non posso sostenere che printf () non sia conciso ma più flessibile (IMO) e più semplice da capire, una volta superato il WTF iniziale per i codici macro.

double pi = 3.14285714;

cout << "pi = " << setprecision(5)  << pi << '\n';
printf( "%.5f\n", pi );

cout << "pi = " << fixed << showpos << setprecision(3) << pi << '\n'; 
printf( "%+.3f\n", pi );

cout << "pi = " << scientific << noshowpos << pi<< '\n';
printf( "%e\n", pi );

La domanda

Sì, potrebbe esserci la necessità di una migliore libreria C ++, molti sono FastFormat è quella libreria, solo il tempo lo dirà.

dave

Altri suggerimenti

Per me bandire i sovraccarichi del buffer sembra una grande vittoria per C ++.

Dai un'occhiata a

http://www.ddj.com/cpp/184403651

allora preferirai l'I / O C ++ che l'I / O C.

in breve C è preferibile se si conoscono le dimensioni dei dati prima di leggere o scrivere e per la velocità. Il C ++ è preferito se non si conoscono le dimensioni dei dati e per un codice efficiente.

In risposta alla risposta di David Allan Finch, ho risolto un errore nel suo codice di benchmarking (ha svuotato il flusso nella versione C ++ dopo ogni singola riga) e riprovato il test:

Il ciclo C ++ ora assomiglia a questo:

start = time(0);
{
    ofstream outdata("example2.txt");
    for( int i = 0; i < max; i++ )
    {
        outdata << teststr << ":" << i << "\n"; // note, \n instead of endl
    }
}
end = time(0);

Eseguo 10000000 iterazioni (10 volte di più rispetto al codice originale, perché altrimenti i numeri sono troppo piccoli per la pessima risoluzione di time () per darci qualcosa di significativo)) E l'output è:

G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s

MSVC9.0:
C FILE: 10s
C++ Streams: 23s

(nota, la versione MSVC è stata eseguita sul mio laptop con un hard disk significativamente più lento)

Ma questo ci dà una differenza di prestazioni di 1,5-2,3x, a seconda dell'implementazione. e altri fattori esterni.

Le differenze di prestazioni tra la formattazione dei flussi di I / O in stile printf () / fwrite e la C ++ IO dipendono molto dall'implementazione. Alcune implementazioni (ad esempio Visual C ++), costruiscono i loro flussi IO su oggetti FILE * e questo tende ad aumentare la complessità runtime della loro implementazione. Si noti, tuttavia, che non vi era alcun vincolo particolare per implementare la libreria in questo modo.

A mio avviso, i vantaggi dell'I / O C ++ sono i seguenti:

  • Digitare safety come già indicato in precedenza.
  • Flessibilità di attuazione. Il codice può essere scritto per eseguire una formattazione specifica o input da o verso un oggetto ostream o istream generico. L'applicazione può quindi invocare questo codice con qualsiasi tipo di oggetto flusso derivato. Se il codice che ho scritto e testato su un file ora deve essere applicato a un socket, una porta seriale o qualche altro tipo di flusso interno, è possibile creare un'implementazione del flusso specifica per quel tipo di I / O. L'estensione dell'I / O in stile C in questo modo non è nemmeno possibile.
  • Flessibilità nelle impostazioni locali: l'approccio C dell'uso di una singola locale globale è, secondo me, gravemente imperfetto. Ho riscontrato casi in cui ho invocato il codice della libreria (una DLL) che ha modificato le impostazioni internazionali globali sotto il mio codice e ha incasinato completamente il mio output. Un flusso C ++ ti consente di inserire () qualsiasi locale in un oggetto flusso.

std :: ifstream e std :: ofstream sono già nella libreria stl. Non devi crearne uno tuo.

Il vantaggio principale è che tutte le uscite e gli ingressi sono di tipo sicurezza.

C e C ++ sono due lingue diverse. Il file C ++ io richiede un po 'di tempo per abituarsi, ma una volta che si utilizzano algoritmi, eccezioni ecc., Tendono a posizionarsi in modo molto naturale.

Ogni volta che devo prendere input / dare output in un file in C ++, uso solo due righe.

freopen("input.txt","r",stdin); // for input from file
freopen("output.txt","w",stdout);// for output from file

Ora puoi scansionare le variabili come faresti normalmente dalla console e qualsiasi cosa tu stampi come output verrà visualizzata nel file output.txt.

Quindi non penso che l'I / O dei file in c ++ sia difficile, piuttosto più semplice di c.

Un sacco. Svantaggi anche. Vedi le domande frequenti sul linguaggio C ++ per i dettagli. In breve: tipi-sicurezza e tipi definiti dall'utente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top