Prós e contras de stdio versus streams

ZHN:  

Gente, o que há de tão especial com streams? stdio é tão fácil de se usar e funciona bem em C++, pelo menos aparentemente.

KUEHL: Dietmar Kuehl <kuehl@horn.informatik.uni-konstanz.de>

Há alguns prós e contras no uso de iostreams. De qualquer forma, considero que o uso de iostreams é a melhor escolha na maioria, se não em todos os casos. Aqui estão os prós e os contras:

Você pode integrar operações de I/O para os seus próprios tipos de dados quando usa iostreams. Isso é impossível com stdio. A possibilidade de usar a mesma sintaxe tanto para user defined types quanto para standard types é uma aplicação importante da facilidade de sobrecarga, e torna o programa muito mais inteligível e de mais fácil manutenção.

Você pode integrar novas representações externas ao iostreams. Para stdio, tal como definido em C90 (ISSO 9899), isso não é realmente possível. Você pode resolver uma parte do problema usando
vsprintf() e vsscanf(), mas normalmente o código C é escrito para passar ao largo de FILE* e você não pode definir uma nova representação externa acessada via um FILE*. Em C++, os streams nos quais se quer escrever são identificados usando-se istream& e ostream& e os streams correspondentes podem ser facilmente extendidos definindo-se sub-classes de streambuf.

Verificação de tipos pode ser implementada tanto em stdio quanto em iostreams, e são equivalentes, pelo menos para os tipos de dados standard. Eg.
gcc verifica se o string de formatação é compatível com o argumento, exceto quanto o string de formatação não é fornecido como uma literal.

Contudo, parece que esse recurso de verificação de tipos não é muito usado: eu ainda estou para ver um uso não-trivial de stdio em um programa real em que não haja pelo menos um erro de formatação de strings. De modo especial, normalmente se erra na formatação de ponto flutuante, principalmente porque há diferentes especificadores de formatação para ponto flutuante duplo: "
%lf" e "%f", respectivamente. Portanto, embora sejam conceitualmente equivalentes, nesse aspecto em particular, iostreams é melhor.

O suporte para internacionalização em ambos é basicamente idêntico.

As dificuldades de se aprender stdio e iostreams são equivalentes. stddio é definitivamente mais difícil - não raro, até mesmo experts cometem erros sutís - mas tem uma grande quantidade de documentação. Por outro lado, iostream é mais fácil de se aprender e seu uso é menos sujeito a erros - exceto quando se tenta implementar classes derivadas de
istream e/ou ostream - mas está coberto por pouca documentação.

Todas as implementações atuais de iostreams são menos eficientes que as implementações de stdio, seja em termos de tempo de execução, tamanho do código, tempo de compilação e tamanho do objeto. 

Há alguns recursos de iostream que não tem um equivalente em stdio. (Eg, a possibilidade de alterar o modo como os tipos standard são processados usando-se implementação do usuário em locale objects), mas há, em contrapartida, algumas coisas que você não pode fazer com iostream
(Eg, escrever apenas uma parte do string quando passa o string como um char const).

Penso que cobri a diferenças mais importantes entre stdio e iostreams. Se houver outras, sinta-se à vontade para me corrigir.

Eu considero que os prós de iostream são muito mais relevantes que os seus contras, especialmente porque as operações de I/O com stdio ou iostream não são, normalmente, operações pesadas e nem tem uma exigência de eficiência crítica. Quando assim for, é fácil substituir o uso de iostream por stdio.

É claro que a avaliação de prós e contras não é rigososamente objetiva. É, antes, um ponto de vista pessoal. Para a sua própria aplicação, você deve fazer o seu próprio julgamento.

ZHN:

As poucas questões que ficaram por responder dizem respeito a história de stdio e de iostream

KUEHL:

Bem, stdio foi apresentada por Kernighan e Richie com a versão original do C e permanece sem nenhuma alteração importante desde então.

iostream passou por duas grandes implementações, onde a segunda representou uma grande alteração técnica mas não alterou os conceitos básicos. Não posso dizer que originalmente projetou ou implementou iostream, mas foi Jerry Schwartz quem apresentou a separação de stream buffers relativamente cedo na história do C++, mas após o release original de Stroustrup. Durante a padronização, algumas funções foram renomeadas mas a grande alteração foi a introdução de templates para suportar diferentes tipos de dados. Isso requereu a introdução de regionalização para fazer frente a certos aspectos difíceis de se codificar em iostream mas que agora são indispensáveis (Eg, formatação numérica)

ZHN:

É ou não é seguro usar ambos no mesmo programa?

KUEHL:

É absolutamente seguro usar stdio e iostream no mesmo programa. De fato, stdio e iostreams interferem apenas nos standard streams (stdin, stdout, e stderr vs. cin, cout, cerr, clog, wcin, wcout, wcerr, e wclolg; todos são namespace std, é claro).

Se você escrever alternadamente a partir de stdio e a partir de iostream para esses streams, pode ocorrer um problema. No entanto, por default - ou seja, a menos que você invoque std::ios_base::sync_with_stdio(false) os streams stdio são sincronizados com os correspondentes iostreams, o que significa que esses iostreams não são buferizados (Isso não é totalmente verdadeiro, mas está muito próximo da verdade).

Não há um modo padronizado de se usar qualquer outro stream a partir de stdio e de iostream simultaneamente e assim não há que temer outros conflitos. No entanto, é plenamente possível criar-se classes iostream para cooperar com FILE*.

ZHN:

E como stdio e iostream se relacionam, se é que se relecionam.

KUEHL:

A única relação entre stdio e iostream determinada pela padronização é que:

  • stdin e cin/wcin lem da mesma origem
  • stdout e cout/wcin,
  • stderr e cerr/wcerr,
  • stderr e clog/wclog escrevem para o mesmo destino

Potencialmente, os streams correspondentes são, de certa forma, sincronizados.

ZHN:

Outra grande ajuda para muitos de nós, não treinados em C++, é: onde podemos encontrar boas referências a respeito de streams.

KUEHL:

Pode-se encontrar alguma informação disponível na Web. Veja <http://www.dinkumware.com/>.


Do original CppTips 
traduzido por Dagoberto Haele Arnaut, com permissão de Allan D. Clarke

| Home | Bookmarks | Universidades | Para Saber mais | Universidades | WEB Directory | Mapa do site |