Alguém pode explicar em Inglês simples sobre as diferenças entre printf, fprintfe sprintfcom exemplos?
Em que fluxo está?
Estou realmente confuso entre os três enquanto lê sobre "File Handling in C".
Alguém pode explicar em Inglês simples sobre as diferenças entre printf, fprintfe sprintfcom exemplos?
Em que fluxo está?
Estou realmente confuso entre os três enquanto lê sobre "File Handling in C".
Respostas:
Em C, um "fluxo" é uma abstração; da perspectiva do programa, é simplesmente um produtor (fluxo de entrada) ou consumidor (fluxo de saída) de bytes. Pode corresponder a um arquivo em disco, a um tubo, ao seu terminal ou a algum outro dispositivo, como uma impressora ou tty. O FILEtipo contém informações sobre o fluxo. Normalmente, você não mexe FILEdiretamente no conteúdo de um objeto, apenas passa um ponteiro para ele para as várias rotinas de E / S.
Existem três fluxos padrão: stdiné um ponteiro para o fluxo de entrada padrão, stdouté um ponteiro para o fluxo de saída padrão e stderré um ponteiro para o fluxo de saída de erro padrão. Em uma sessão interativa, os três geralmente se referem ao seu console, embora você possa redirecioná-los para apontar para outros arquivos ou dispositivos:
$ myprog < inputfile.dat > output.txt 2> errors.txt
Neste exemplo, stdinagora aponta para inputfile.dat, stdoutaponta para output.txte stderraponta para errors.txt.
fprintf grava texto formatado no fluxo de saída que você especificar.
printfé equivalente a escrever fprintf(stdout, ...)e gravar texto formatado para onde o fluxo de saída padrão estiver apontando no momento.
sprintfgrava texto formatado em uma matriz de char, ao contrário de um fluxo.
printf ("formato", args) é usado para imprimir os dados na saída padrão, que geralmente é um monitor de computador.
sprintf (char *, "format", args) é como printf. Em vez de exibir a string formatada na saída padrão, ou seja, um monitor, ele armazena os dados formatados em uma string apontada pelo ponteiro char (o primeiro parâmetro). A localização da string é a única diferença entre a sintaxe printf e sprint.
fprintf (FILE * fp, "format", args) é como printf novamente. Aqui, em vez de exibir os dados no monitor ou salvá-los em alguma sequência, os dados formatados são salvos em um arquivo que é apontado pelo ponteiro do arquivo que é usado como o primeiro parâmetro para fprintf. O ponteiro do arquivo é a única adição à sintaxe do printf.
Se o arquivo stdout for usado como o primeiro parâmetro no fprintf, seu funcionamento será considerado equivalente ao do printf.
printf(...)é equivalente a fprintf(stdout,...).
fprintf é usado para gerar a saída para transmitir.
sprintf(buffer,...) é usado para formatar uma string em um buffer.
Nota também existe vsprintf, vfprintfevprintf
vsabores são não-padrão eu acredito
vsabores estão certamente no padrão C.
Você também pode fazer coisas muito úteis com a função vsnprintf ():
$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>
struct exception_fmt : std::exception
{
exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
char const* what() const throw() { return msg_; }
char msg_[0x800];
};
exception_fmt::exception_fmt(char const* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(msg_, sizeof msg_, fmt, ap);
va_end(ap);
}
int main(int ac, char** av)
{
throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}
$ g++ -Wall -o test test.cc
$ ./test
terminate called after throwing an instance of 'exception_fmt'
what(): ./test: bad number of arguments 1
Aborted (core dumped)
vsnprintfé uma função não padrão. A maioria das implementações que vi implementam isso ou algo parecido, mas é específico da implementação.
printf
printf("control string ", argument );fprintf
fprintf (filename, "control string ", argument );sprintf: Grava dados formatados em uma cadeia de caracteres na memória em vez de stdout
A sintaxe do sprintf é:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Aqui,
String refere-se ao ponteiro para um buffer na memória onde os dados devem ser gravados.
Formato refere-se ao ponteiro para uma cadeia de caracteres que define o formato.
Cada item é uma variável ou expressão que especifica os dados a serem gravados.
O valor retornado pelo sprintf é maior ou igual a zero se a operação for bem-sucedida ou, em outras palavras, o número de caracteres gravados, sem contar o caractere nulo final, é retornado e retorna um valor menor que zero se ocorrer um erro.
printf: imprime em stdout
A sintaxe para printf é:
printf format [argument]…
A única diferença entre sprintf () e printf () é que sprintf () grava dados em uma matriz de caracteres, enquanto printf () grava dados no stdout, o dispositivo de saída padrão.