me ajudem com a explicação desse pedaço de código.

1. me ajudem com a explicação desse pedaço de código.

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/10/2016 - 15:01h

o link do codigo é este aq: http://forum.clubedohardware.com.br/uploads/monthly_2016_10/Capturar.PNG.dab7d3d72ac22d84559ea530b2f... bom, ele vai pegar arqumentos de linha de comando, e vai testar, mas eu não entendo oq FPRINTF faz ali (em vermelho), pq a string contante é imprimida na tela (em azul) e tem tbm "stderr", mas não tem nenhum printf, podem me ajudar. OBS: isso é de um jogo o sudoku.


  


2. Re: me ajudem com a explicação desse pedaço de código.

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/10/2016 - 15:35h

O sistema possui entrada-padrão (stdin), saída-padrão (stdout) e saída-padrão de erros (stderr).
fprintf() escreve alguma coisa em algum lugar, com um parâmetro extra que indica onde.
No lugar de stderr poderia estar um identificador de arquivo, que mandaria a gravação para tal lugar.

É um printf() com uma opção a mais.
Se for pensar printf() praticamente manda sempre para a mesma saída.

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



3. Re: me ajudem com a explicação desse pedaço de código.

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/10/2016 - 16:28h

stderr é um stream associado ao local que recebe as mensagens de erro.

Tipicamente, quando você faz login num terminal linux ou no console do Windows, a saída de mensagens de erro vai para o próprio terminal, bem como a saída de mensagens normais.

O C define três streams padrão:

  Stream | Buffer | Função                       | Associado por padrão a
-------+--------+------------------------------+------------------------
stdin | Linha | Padrão para entrada de dados | Terminal (teclado)
stdout | Linha | Padrão para saída de dados | Terminal (tela)
stderr | Não | Padrão para saída de erros | Terminal (tela)


Um stream com buffer orientado a linha significa que as funções de leitura ou escrita aguardam o fim da linha (presença do caráter '\n') antes de completar a operação de modo visível. Por exemplo: se você chamar “printf("Teste")”, o texto “Teste” possivelmente não será impresso imediatamente, mas ficará retido num buffer até que uma operação de escrita subsequente inclua uma quebra de linha. Por outro lado, um stream não bufferizado implica que qualquer operação será imediatamente repassada para uma operação de saída real do sistema, sem aguardar quebras de linha nem qualquer outra situação.

Faz sentido para mim que uma mensagem de erro não fique aguardando para ser enviada ao usuário.

Operações de escrita que não especificam destino são funcionalmente equivalentes a operações realizadas sobre stdout. Por exemplo:

  Esta operação...          |  ... é funcionalmente equivalente a esta(s)
--------------------------+----------------------------------------------
printf("Valor=%d\n", n); | fprintf(stdout, "Valor=%d\n", n);
putchar('\n'); | fputc('\n', stdout);
puts("Linha"); | fputs("Linha", stdout); fputc('\n', stdout);


De modo análogo, operações de leitura que não pedem stream implicam que a leitura é feita a partir de stdin.

  Esta operação...                |  ... é funcionalmente equivalente a esta
--------------------------------+-----------------------------------------
scanf("%f", &x); | fscanf(stdin, "%f", &x);
int ch=getchar(); | int ch=fgetc(stdin);
(gets() removido do C em 2011) | fgets(linha, tamanho_linha, stdin);


O fato de mensagens comuns e mensagens de erro terem destinos diferentes é útil, sobretudo em casos de redirecionamento. Por exemplo, a linha abaixo descarta as mensagens de erro, redirecionando-as para /dev/null, que podem advir de haver diretórios no meio de uma lista de nomes de arquivos passadas ao comando grep.

grep -l Fulano /etc/* 2>/dev/null >/tmp/arquivo_de_saida.txt 


Às vezes você pode querer redirecionar a saída de erros para um lugar útil. O exemplo abaixo mostra três redircionamentos: da entrada padrão, a partir de um arquivo de logs, da saída de erros, para um arquivo de mensagens de erro, e da saída padrão, para um pipe que executa o comando sort.

processa_logs < /var/log/secure 2>/home/fulano/erros.txt | sort 







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts