[Powered by Google Translate] TOMMY: Neste vídeo, vamos aprender sobre
redirecionando e canos.
Até agora, estamos usando funções como printf para
dados de saída para o terminal e funções como GetString
para permitir ao usuário a contribuir para o nosso
programa usando o teclado.
Vamos rapidamente dar uma olhada em um programa que recebe uma linha de
entrada do usuário e, em seguida, gera-lo.
>> Na linha 7, estamos alertando o usuário para uma string, e
em seguida, na linha 8, estamos imprimindo-lo de volta.
Vamos compilar e executar o nosso programa.
Grande.
A seqüência de nós desde ecoou de volta
para nós no terminal.
Isso aconteceu porque a função printf escreveu a um
fluxo chamado padrão, ou s-t-d-out.
Quando algo está escrito na saída padrão, é por padrão
exibida pelo terminal.
>> Então, isso é tudo muito bem, mas o que se, em vez de simplesmente
exibindo a string, queria salvá-lo em um arquivo?
Por exemplo, pode querer se lembrar exatamente o que o nosso
programa fez quando deu uma entrada em particular mais tarde.
Uma abordagem seria fazer isso em nosso programa de C, utilizando
algumas funções especiais para a gravação de arquivos que vamos
ver em outro vídeo.
Ainda mais fácil, no entanto, seria de alguma forma
redirecionar stdout para um arquivo.
Dessa forma, quando printf escreve para stdout, o conteúdo será
ser escrito em um arquivo, em vez de
exibida pelo terminal.
Nós podemos fazer isso adicionando um sinal de maior-que, seguido
por um nome de arquivo, para o comando que usamos para executar o nosso programa.
>> Então, ao invés de simplesmente executar. / Redirecionamento, podemos
execute. / redirecionamento, seguido por um sinal de maior, seguida pela
nome do arquivo, como file.txt.
Vamos ver o que acontece.
OK.
Observe que, desta vez, nada foi exibida no terminal,
mas nós não têm modificado o conteúdo de nossa
C programa em tudo.
Vamos agora examinar o conteúdo desse diretório com ls.
>> Tudo bem.
Temos, agora, um novo arquivo no nosso diretório chamado file.txt,
que é o nome do arquivo que forneceu quando rodamos nosso
Redirecionar programa.
Vamos abrir file.txt.
E aqui, nós podemos ver que o stdout de redirecionar foi
escrito para o arquivo chamado arquivo.txt.
Então, vamos executar novamente o comando anterior, mas fornecendo uma
entrada diferente desta vez.
Okay.
Vamos dar uma olhada em file.txt agora.
>> Podemos ver aqui que o arquivo foi substituído, por isso a nossa
entrada original não está mais lá.
Se em vez quero acrescentar a este arquivo, colocando o novo
entrada abaixo os conteúdos existentes no arquivo, podemos
usar dois sinais de maior, em vez de apenas um.
Vamos tentar isso.
Agora, se abrirmos file.txt novamente, podemos ver tanto da nossa
linhas de entrada.
Em alguns casos, pode-se desejar descartar qualquer
saída do nosso programa.
Ao invés de escrever a saída para um arquivo e depois apagar
o arquivo quando estamos a fazer com ela, podemos escrever uma especial para
arquivo chamado / dev / null.
Quando alguma coisa é escrita / dev/null--
ou apenas devnull para breve -
ele é automaticamente descartado.
Então pense devnull como um buraco negro para os seus dados.
>> Então, agora temos visto como o sinal maior do que pode redirecionar
stdout, vamos ver como podemos redirecionar padrão em -
ou s-t-d-in -
o análogo da stdout.
Enquanto funções como printf gravar o fluxo de chamadas
GetString stdout, e funções similares lidos do fluxo
chamado stdin, que, por padrão, é o fluxo de
caracteres digitados no teclado.
Podemos redirecionar stdin usando a menos de sinal, seguido
por um nome de arquivo.
Agora, em vez de avisar o usuário para a entrada no
terminal, um programa irá abrir o arquivo que nós especificamos e usar
suas linhas como entrada.
>> Vamos ver o que acontece.
Grande.
A primeira linha de file.txt foi exibida no terminal
porque estamos chamando GetString uma vez.
Se tivéssemos outra chamada para GetString em nosso programa, o
próxima linha de file.txt teria sido utilizada como
entrada para a chamada.
Mais uma vez, nós não têm modificado o nosso programa C em tudo.
Estamos apenas mudando o modo como executá-lo.
E lembre-se também, não temos redirecionado stdout este tempo,
de modo que o resultado do programa foi ainda
exibida no terminal.
Podemos, evidentemente, tanto redireccionar stdin
e stdout como este.
Agora, file2.txt contém a primeira linha de file.txt.
>> Assim, usando esses operadores, temos sido capazes de ler e
escrever a partir de arquivos de texto.
Agora, vamos ver como podemos usar a saída de um programa como
a entrada para outro programa.
Então aqui está um outro programa C simples eu
ter aqui chamado hello.c.
Como você pode ver, este simplesmente exibe "Oi
lá "para o utilizador.
Se eu quiser redirecionar para usar como entrada a saída de Olá -
outro programa -
Eu poderia redirecionar o stdout primeiro de Olá para um arquivo chamado
input.txt, então redirecionar a stdin de redirecionar para o mesmo
arquivo - input.txt.
Para que eu possa fazer. / Olá input.txt>.
Pressione Enter para executar isso.
Seguido por. / Redirecionar <
input.txt e executar isso.
Assim, podemos encurtar isso um pouco com um ponto e vírgula, o que permite
nós para executar dois ou mais comandos na mesma linha.
Então eu posso dizer,. / Olá> input.txt, ponto e vírgula,
. / Redirecionar input.txt <.
>> Então, isso funciona, mas ele ainda se sente muito deselegante.
Quero dizer, nós realmente precisamos desse arquivo de texto intermediário que é
não é mais necessário depois de redirecionar corridas?
Felizmente, podemos evitar esse arquivo de texto extra usando o que há de
chamado um tubo.
Se eu digo, / Olá |.. / Redirecionar, então o stdout
o programa à esquerda -
neste caso, Olá -
será usada como a entrada para o padrão
programa, à direita.
Neste caso, o redireccionamento. Então, vamos executar este.
>> Lá vamos nós.
Podemos ver que a saída da Olá foi usada como a entrada
para redirecionar.
Amarrando comandos em conjunto, utilizando tubos, que formam o que é
chamado de um gasoduto, uma vez que nossa produção é essencialmente movendo
através de uma seqüência de comandos.
Usando tubos, podemos fazer algumas coisas legais sem a necessidade de
escrever qualquer código em tudo.
Por exemplo, vamos dizer que queremos saber quantos arquivos são
dentro deste diretório.
Usando um tubo, podemos combinar o comando ls com o wc -
ou wordcount -
comando.
Ls saída de cada arquivo no diretório para stdout, e
wc vai nos dizer quantas linhas foram dadas a ele através de stdin.
Então, se nós dizemos ls | wc-l -
fornecer o L-bandeira para wc dizer a ele para contar linhas -
podemos ver exatamente quantos arquivos são
no diretório atual.
>> Então, vamos dar uma olhada em mais um exemplo.
Eu tenho aqui um arquivo chamado students.txt,
com uma lista de nomes.
No entanto, esses nomes não estão em nenhuma ordem de tudo isso, e parece
como alguns nomes se repetem.
O que queremos é uma lista de nomes exclusivos em alfabética
ordem, salvo em um arquivo chamado final.txt.
Poderíamos, é claro, escrever um programa em C para fazer isso por nós.
Mas vai ficar desnecessariamente
complexo muito rapidamente.
Vamos, em vez usar tubos e alguns built-in-ferramentas para resolver
este problema.
>> A primeira coisa que precisamos fazer é ler o students.txt arquivo.
O comando cat vai fazer exatamente isso.
Ele vai ler o arquivo especificado e escrever
seu conteúdo para stdout.
Depois que li o arquivo de texto, vamos
deseja classificar os nomes.
O comando sort pode lidar com isso para nós.
Ordenar saída será a linha fornecida através de stdin stdout
em ordem de classificação.
De modo a fornecer o conteúdo do students.txt para
stdin tipo, poderíamos usar um tubo para combinar gato e tipo.
Para que eu possa executar gato students.txt | sort e
pressione Enter.
E agora, vemos o conteúdo da students.txt em
ordem alfabética.
>> Então, vamos adicionar outro comando -
uniq, ou única -
ao nosso pipeline.
Como você pode imaginar, uniq, quando fornecida uma seqüência ordenada de
linhas através de stdin, irá imprimir as linhas originais.
Portanto, agora temos students.txt gato
| Sort | uniq.
Finalmente, podemos salvar a saída do gasoduto a um
arquivo via gato students.txt | sort | uniq
> Final.txt.
Então, se abrirmos final.txt, temos exatamente o que nós
procurando:
uma lista de nomes exclusivos em ordem alfabética,
salvos em um arquivo de texto.
A propósito, também poderia ter dito tipo <
students.txt | uniq> final.txt fazer exatamente
a mesma coisa, usando cada um dos operadores que já vimos em
este vídeo.
>> Meu nome é Tommy, e este é o CS50.