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?
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 ??strong>
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