Entrada e saída: mudanças entre as edições
De Wikiunicentro
 Criou página com '== Fluxos Padrões == * Fluxos Padrões (Standard Streams) são canais de entrada e saída. <br> Arquivo:Exemplo.jpg  == Standard Input == * Fluxo por onde dados entram no...'  | 
				Sem resumo de edição  | 
				||
| Linha 13: | Linha 13: | ||
* Exemplo:  | * Exemplo:  | ||
<code>  | <code>  | ||
int value; <br>  |  int value; <br>  | ||
fscanf(stdin, “%d”, &value); <br>  |  fscanf(stdin, “%d”, &value); <br>  | ||
scanf(“%d”, &value); // Equivalente à linha anterior <br>  |  scanf(“%d”, &value); // Equivalente à linha anterior <br>  | ||
cin >> value; // Em C++  |  cin >> value; // Em C++  | ||
</code>    | </code>    | ||
<br><br>  | <br><br>  | ||
| Linha 29: | Linha 29: | ||
* Exemplo:  | * Exemplo:  | ||
<code>  | <code>  | ||
fprintf(stdout, “%s”, “Hello World\n”); <br>  |  fprintf(stdout, “%s”, “Hello World\n”); <br>  | ||
printf(“Hello World\n”); // Equivalente à linha anterior <br>  |  printf(“Hello World\n”); // Equivalente à linha anterior <br>  | ||
cout << “Hello World” << endl; // Em C++ <br>  |  cout << “Hello World” << endl; // Em C++ <br>  | ||
</code>  | </code>  | ||
<br><br>  | <br><br>  | ||
| Linha 44: | Linha 44: | ||
* Exemplo:  | * Exemplo:  | ||
<code>  | <code>  | ||
fprintf(stderr, “Application error\n”); <br>  |  fprintf(stderr, “Application error\n”); <br>  | ||
cerr << “Application error” << endl; <br>  |  cerr << “Application error” << endl; <br>  | ||
</code>  | </code>  | ||
<br><br>  | <br><br>  | ||
| Linha 106: | Linha 106: | ||
     return (EXIT_SUCCESS); <br>  |      return (EXIT_SUCCESS); <br>  | ||
  }  |   }  | ||
</code>  | |||
<br>  | |||
== Entra e saída pelo terminal ==  | |||
<code>  | |||
 paulo@notebook:~$ gcc exemplo.c -o fluxo <br>  | |||
 paulo@notebook:~$ ./fluxo <br>  | |||
 1 <br>  | |||
 Recebi 1 <br>  | |||
 2 <br>  | |||
 paulo@notebook:~$  | |||
</code>  | |||
<br>  | |||
<code>  | |||
 paulo@notebook:~$ ./fluxo < /dev/zero <br>  | |||
 Recebi 0 <br>  | |||
 1 <br>  | |||
 paulo@notebook:~$  | |||
</code>  | |||
<br>  | |||
<code>  | |||
 paulo@notebook:~$ ./fluxo < /dev/zero > saida.txt <br>  | |||
 Recebi 0 <br>  | |||
 paulo@notebook:~$ cat saida.txt <br>  | |||
 1 <br>  | |||
 paulo@notebook:~$   | |||
</code>  | |||
<br>  | |||
<code>  | |||
 paulo@notebook:~$ ./fluxo < /dev/zero 2>/dev/null <br>  | |||
 1 <br>  | |||
 paulo@notebook:~$  | |||
</code>  | |||
<br>  | |||
<code>  | |||
 paulo@notebook:~$ ./fluxo < /dev/zero | ./fluxo <br>  | |||
 Recebi 0 <br>  | |||
 Recebi 1 <br>  | |||
 2 <br>  | |||
 paulo@notebook:~$   | |||
</code>  | |||
<br>  | |||
<code>  | |||
 paulo@notebook:~$ ./fluxo < /dev/zero | \ <br>  | |||
 > ./fluxo | ./fluxo | ./fluxo <br>  | |||
 Recebi 0 <br>  | |||
 Recebi 1 <br>  | |||
 Recebi 2 <br>  | |||
 Recebi 3 <br>  | |||
 4 <br>  | |||
 paulo@notebook:~$  | |||
</code>  | </code>  | ||
Edição das 14h37min de 29 de setembro de 2014
Fluxos Padrões
- Fluxos Padrões (Standard Streams) são canais de entrada e saída.
 
Standard Input
- Fluxo por onde dados entram no programa;
- Pelo teclado quando não é redirecionada;
 
 - C: FILE*stdin definida em stdio.h;
 - C++: std::cin definida na iostream.
 
- Exemplo:
 
int value; 
fscanf(stdin, “%d”, &value); 
scanf(“%d”, &value); // Equivalente à linha anterior 
cin >> value; // Em C++
 
Standard Output
- Fluxo onde o programa escreve dados de saída;
 - Quando não redirecionada, a saída é escrita no terminal onde o programa foi iniciado;
 - C: FILE *stdout definida em stdio.h;
 - C++: std::cout definida na iostream.
 
- Exemplo:
 
fprintf(stdout, “%s”, “Hello World\n”); 
printf(“Hello World\n”); // Equivalente à linha anterior 
cout << “Hello World” << endl; // Em C++ 
Standard Error
- Fluxo de saída tipicamente usado por programas para mostrar mensagens de erro ou de diagnósticos;
 - O destino geralmente é o terminal de texto onde o programa foi iniciado, para ter mais chance de ser visto, mesmo que a saída padrão seja redirecionada.
 - C: FILE *stderr definida em stdio.h;
 - C++: std::cerr e std:clog definida na iostream.
 
- Exemplo:
 
fprintf(stderr, “Application error\n”); 
cerr << “Application error” << endl; 
Redirecionamento de Fluxo
- Recurso de ambientes UNIX, MS-DOS e do Prompt de Comando do Windows;
 - Permitem definir o nome do arquivo I/O através da linha de comando para executar o programa.
 - Como fazer:
- Escreva programas como um Filtro;
 - Um filtro é um programa que lê dados da stdin, e escreve dados na stdout;
 - Ler dados da entrada do teclado (não de um arquivo);
 - Escrever dados no terminal (não em um arquivo).
 
 
- Simbolos de redirecionamento de I/O: 
 
- Exemplo:
 
| meu prog | Roda o programa meu prog. Lê dados do teclado, e escreve a saída no monitor. | 
| meu prog < arq.dat | Roda o programa meuprog. Lê dados do arquivo arq.dat. Escreve a saída no monitor. | 
| meu prog > arq.out | Roda o programa meuprog. Lê entrada doteclado. Escreve saída no arquivo arq.out. | 
| meu prog >> arq.out | Roda o programa meuprog. Lê entrada do teclado. Adiciona a saída ao final do arquivo arq.out. | 
| prog1 | prog2 | Roda os programas prog1 e prog2. Usa a saída do prog1 como entrada para o prog2. Dizemos que isso é um pipe da saída do prog1 para prog2. | 
| meuprog < arq.dat > arq.out | Roda o programa meuprog. Lê dados do arquivo arq.dat e escreve a saída no arquivo arq.out. | 
| meuprog2 > /dev/null | Roda o programa meuprog. Lê dados do teclado e escreve a saída no monitor. Descarta todos os dados escritos em stderr. | 
- Código-fonte:
 
#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
   int valor; 
   scanf("%d", &valor); 
   fprintf(stderr, "Recebi %d\n", valor); 
   printf("%d\n", valor + 1); 
   return (EXIT_SUCCESS); 
}
Entra e saída pelo terminal
paulo@notebook:~$ gcc exemplo.c -o fluxo 
paulo@notebook:~$ ./fluxo 
1 
Recebi 1 
2 
paulo@notebook:~$
paulo@notebook:~$ ./fluxo < /dev/zero 
Recebi 0 
1 
paulo@notebook:~$
paulo@notebook:~$ ./fluxo < /dev/zero > saida.txt 
Recebi 0 
paulo@notebook:~$ cat saida.txt 
1 
paulo@notebook:~$ 
paulo@notebook:~$ ./fluxo < /dev/zero 2>/dev/null 
1 
paulo@notebook:~$
paulo@notebook:~$ ./fluxo < /dev/zero | ./fluxo 
Recebi 0 
Recebi 1 
2 
paulo@notebook:~$ 
paulo@notebook:~$ ./fluxo < /dev/zero | \ 
> ./fluxo | ./fluxo | ./fluxo 
Recebi 0 
Recebi 1 
Recebi 2 
Recebi 3 
4 
paulo@notebook:~$

