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