Alguém pode explicar em Inglês simples sobre as diferenças entre printf
, fprintf
e sprintf
com 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
, fprintf
e sprintf
com 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 FILE
tipo contém informações sobre o fluxo. Normalmente, você não mexe FILE
diretamente 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, stdin
agora aponta para inputfile.dat
, stdout
aponta para output.txt
e stderr
aponta 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.
sprintf
grava 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
, vfprintf
evprintf
v
sabores são não-padrão eu acredito
v
sabores 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.