Mudanças entre as edições de "Entrada e saída"

(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...')
 
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 11h37min de 29 de setembro de 2014

Fluxos Padrões

  • Fluxos Padrões (Standard Streams) são canais de entrada e saída.


Exemplo.jpg

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.jpg

  • 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:~$