Pergunta

arquivo C ++ I / O é mais difícil do arquivo C / S. Assim, em C ++, criar uma nova biblioteca para arquivo I / O é útil ou não? I <fstream> média Alguém por favor pode dizer existem benefícios no arquivo C ++ I / O?

Foi útil?

Solução

Opinião

Eu não sei de qualquer projeto real que usa fluxos C ++. Eles são muito lento e difícil de usar. Existem várias bibliotecas mais recentes, como FastFormat e versão impulso que afirmam ser melhor havia um pedaço na última revista ACCU sobrecarga sobre eles. Pessoalmente, tenho usado a biblioteca c ARQUIVO para os últimos 15 anos ou mais em C ++ e eu posso ver nenhuma razão ainda para a mudança.

Speed ??

Aqui é pequeno programa de teste (I bater juntos rapidamente) para mostrar o problema básico de velocidade:

#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 os resultados no meu PC:

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

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

Como podemos ver apenas este exemplo simples é 52x mais lento. Espero que há maneiras de torná-lo mais rápido!

NOTA: mudando endl para '\ n' no meu exemplo melhorou C ++ córregos tornando-se apenas 3x mais lento do que o arquivo * córregos (graças jalf ) pode haver maneiras de torná-lo mais rápido.

Dificuldade para uso

Eu não posso argumentar que printf () não é concisa mas é mais flexível (IMO) e mais simples de entender, uma vez que você passar a WTF inicial para os códigos de 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 );

A Pergunta

Sim, pode ser, há necessidade de uma biblioteca melhor C ++, muitos estar FastFormat é que a biblioteca, só o tempo dirá.

dave

Outras dicas

tampão Banimento derrapagens parece ser uma grande vitória para C ++ para mim.

Por favor, dê uma olhada no

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

Em seguida, você vai preferir C ++ I / O do que C I / O.

Em suma C é preferível se você sabe o tamanho dos dados antes de ler ou escrever e para a velocidade. C ++ é o preferido, se você não sabe o tamanho dos dados e de código eficiente.

Em resposta a resposta de David Allan Finch, eu fixo um erro no seu código de benchmarking (ele descarregou a operação no C ++ versão após cada linha), e reran o teste:

O loop C ++ agora se parece com isso:

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);

Eu corro 10000000 iterações (10 vezes mais do que no código original, porque, caso contrário, os números são muito pequenos para o tempo () 's péssimo resolução para nos dar algo significativo)) E a saída é:

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

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

(nota, a versão MSVC foi executado no meu laptop com um significativamente mais lento disco rígido)

Mas isso nos dá uma diferença de 1.5-2.3x desempenho, dependendo da implementação. e outros fatores externos.

As diferenças de desempenho entre printf () / style fwrite I / O e C ++ IO córregos formatação são muito dependentes de implementação. Algumas implementações (Visual C ++, por exemplo), construir a sua IO fluxos no topo do * objectos de ficheiro e isso tende a aumentar a complexidade de tempo de execução da sua aplicação. Note, no entanto, que não havia nenhuma restrição particular para implementar a biblioteca desta forma.

Na minha própria opinião, os benefícios do C ++ I / O são as seguintes:

  • Tipo de segurança como já foi dito anteriormente.
  • A flexibilidade de implementação. Código pode ser escrito para fazer a formatação específica ou entrada de ou para um ostream genérico ou objeto istream. A aplicação pode então invocar este código com qualquer tipo de objecto de sequência derivada. Se o código que tenho escrito e testado contra um arquivo agora deve ser aplicado a uma tomada, uma porta serial, ou algum outro tipo de fluxo interno, você pode criar uma implementação de fluxo específico para esse tipo de I / O. Estendendo o estilo C / S desta forma não é nem perto do possível.
  • A flexibilidade em configurações locais: a abordagem C de usar um único local global está, na minha opinião, a sério falho. Tenho casos experientes onde eu invocadas código da biblioteca (a DLL) que mudaram as configurações locais globais sob o meu código e completamente desarrumada minha saída. córrego A C ++ permite que você imbuir () qualquer localidade para um objeto de fluxo.

std :: ifstream e std :: ofstream já estão na biblioteca STL. Você não tem que criar o seu próprio.

O principal benefício é todas as saídas e entradas são segurança de tipo.

C e C ++ são duas línguas diferentes. C ++ io arquivo leva algum tempo para se acostumar, mas uma vez que você estiver usando algoritmos, exceções etc eles tendem a cair no lugar, muito naturalmente.

Sempre que eu preciso tomar entradas / saídas dar em um arquivo em C ++, eu uso apenas duas linhas.

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

Agora você pode digitalizar variáveis ??como você faria normalmente a partir do console, e tudo o que imprimir como saída será exibida no arquivo output.txt.

Então, eu não acho arquivo I / O em C ++ é dura, seu bastante mais fácil do que c.

lotes. Desvantagens também. Veja FAQ linguagem C ++ para obter mais detalhes. Em suma:. Tipo-segurança e tipos definidos pelo usuário

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top