[Powered by Google Translate] Tommy: Neste vídeo, imos aprender sobre redirixido e canos. Ata agora, estamos usando funcións como printf para datos de saída para o terminal e funcións como GetString para permitir ao usuario a contribuír ao noso programa usando o teclado. Imos axiña dar un ollo a un programa que recibe unha liña de entrada do usuario e, a continuación, xera-lo. Na liña 7, estamos alertando o usuario a unha cadea, e a continuación, na liña 8, estamos imprimindo-lo de volta. Imos compilar e executar o noso programa. Grande. A secuencia de nós desde eco de volta para nós no terminal. Iso aconteceu porque a función printf escribiu un fluxo chamado estándar ou s-t-d-out. Cando algo está escrito na saída estándar, e por defecto exhibida polo terminal. Entón, iso é todo moi ben, pero o que si, en vez de simplemente mostrando a cadea, quería salvalo nun arquivo? Por exemplo, pode querer lembrar exactamente o que o noso programa fixo cando deu unha entrada en particular máis tarde. Unha visión sería facelo no noso programa de C, utilizando algunhas funcións especiais para a gravación de ficheiros que imos ver noutro vídeo. Aínda máis fácil, con todo, sería de algunha maneira redireccionar saída estándar para un arquivo. Desta forma, cando printf escribe á saída, o contido será escribir nun ficheiro, en vez de exhibida polo terminal. Podemos facelo engadindo un sinal de maior-que, seguido por un nome de ficheiro para o comando que usamos para executar o noso programa. Entón, en vez de simplemente executar. / Redirección, podemos realice. / redirección, seguido por un sinal de maior, seguida pola nome do ficheiro, como file.txt. Imos ver o que acontece. Aceptar. Teña en conta que, esta vez, nada foi exhibida no terminal, pero non modificaron o contido da nosa C programa en todo. Imos agora examinar o contido deste directorio con ls. Todo ben. Temos, agora, un novo arquivo no noso directorio chamado file.txt, que é o nome do ficheiro que proporcionou cando rodamos noso Redireccionar programa. Imos abrir file.txt. E aquí, podemos ver que o saída estándar de redireccionar foi escrito para o arquivo chamado arquivo.txt. Entón, imos facer de novo o mando anterior, pero introducindo unha entrada diferente desta vez. Okay. Imos dar un ollo a file.txt agora. Podemos ver aquí que o arquivo foi substituído, polo que a nosa entrada orixinal non está alí. Se en vez quero engadir a este ficheiro, colocar o novo entrada de abaixo os contidos existentes no arquivo, podemos usar dous sinais de maior, en vez de só un. Imos tentar iso. Agora, se abrirmos file.txt novo, podemos ver tanto da nosa liñas de entrada. Nalgúns casos, pode-se o desexa descartar calquera saída do noso programa. En vez de escribir a saída a un ficheiro e despois borrar o ficheiro cando estamos a facer con ela, podemos escribir unha especial arquivo chamado / dev / null. Cando algo é escrita / dev/null-- ou só devnull para breve - el automaticamente descartado. Entón pense devnull como un burato negro para os seus datos. Entón, agora temos visto como o sinal máis grande que pode redireccionar saída estándar, imos ver como podemos redireccionar estándar en - ou s-t-d-in - o análogo da saída estándar. Mentres funcións como printf gravar o fluxo de chamadas GetString saída estándar, e funcións similares lidos do fluxo chamado stdin, que, por defecto, é o fluxo de caracteres tecleados no teclado. Podemos redireccionar stdin usando a menos de sinal, seguido por un nome de ficheiro. Agora, en vez de avisar o usuario para a entrada no terminal, un programa ha abrir o ficheiro que especificamos e utilizar súas liñas como entrada. Imos ver o que acontece. Grande. A primeira liña de file.txt foi exhibida no terminal porque estamos chamando GetString unha vez. Se tivésemos outra chamada para GetString no noso programa, o seguinte liña de file.txt sería utilizada como entrada para a chamada. Unha vez máis, non modificaron o noso programa C en todo. Estamos só cambiando o xeito no que executa-lo. E lembre tamén, non temos redirixido saída estándar este tempo, de xeito que o resultado do programa foi aínda exhibida no terminal. Podemos, por suposto, tanto redirixir stdin e saída estándar coma este. Agora, file2.txt contén a primeira liña de file.txt. Así, usando estes operadores, temos sido capaces de ler e escribir a partir de arquivos de texto. Agora, imos ver como podemos utilizar a saída dun programa a entrada a outro programa. Entón aquí está outro programa C simple eu ter aquí chamado hello.c. Como podes ver, este simplemente exhibe "Ola alí "para o usuario. Se eu queira redireccionar para usar como entrada a saída de Ola - outro programa - Eu podería redireccionar o saída estándar primeiro Ola a un arquivo chamado input.txt, entón redireccionar a stdin de redireccionar para o mesmo Arquivo - input.txt. Para que eu poida facer. / Ola input.txt>. Prema Intro para executar isto. Seguido por. / Redireccionar < input.txt e realizar iso. Así, podemos reducir iso un pouco con un punto e coma, o que permite nós para realizar dous ou máis comandos na mesma liña. Entón eu podo dicir,. / Ola> input.txt, punto e coma, . / Redireccionar input.txt <. Entón, isto funciona, pero aínda se sente moi deselegante. Quero dicir, nós realmente necesitamos deste arquivo de texto intermediario que é non é máis necesario tras redireccionar carreiras? Afortunadamente, podemos evitar ese arquivo de texto extra usando o que hai de chamado un tubo. Se eu digo, / Ola | .. / Redireccionar, entón o saída estándar o programa da esquerda - neste caso, Ola - será usada como a entrada para o estándar programa, á dereita. Neste caso, o redireccionamento. Entón, imos realizar este. Alí imos nós. Podemos ver que a saída da Ola foi usada como entrada para redireccionar. Amarre comandos en conxunto, utilizando tubos, que forman o que é chamado dun gasoduto, unha vez que a nosa produción é principalmente movendo a través dunha secuencia de comandos. Usando tubos, podemos facer algunhas cousas legais sen necesidade de escribir calquera código en todo. Por exemplo, imos dicir que queremos saber cantos arquivos dentro deste directorio. Empregando un tubo, podemos combinar o comando ls con baño - ou wordcount - mando. Ls saída de cada ficheiro no directorio á saída, baño vai dicir cantas liñas foron dadas a el a través de stdin. Entón, se nós dicimos ls | WC-l - facilitar o L-bandeira para baño dicir a el para contar liñas - podemos ver exactamente cantos arquivos no directorio actual. Entón, imos dar un ollo a un exemplo. Eu teño aquí un arquivo chamado students.txt, cunha lista de nomes. Con todo, eses nomes non están en ningunha orde de todo isto, e parece como algúns nomes repítense. O que queremos é unha lista de nomes exclusivos en alfabética orde, salvo nun arquivo chamado final.txt. Poderiamos, por suposto, escribir un programa en C para facelo por nós. Pero vai estar innecesariamente complexo moi rapidamente. Imos, en vez usar tubos e algúns built-in-ferramentas para resolver este problema. A primeira cousa que cómpre facer é ler o students.txt arquivo. O comando cat vai facer exactamente isto. El vai ler o ficheiro especificado e escribir seu contido á saída. Despois que lin o arquivo de texto, imos quere clasificar os nomes. O comando sort pode tratar con isto para nós. Ordenar saída será a liña fornecida a través de stdin saída estándar en orde de clasificación. Fin de achegar o contido do students.txt para stdin tipo, poderiamos usar un tubo para combinar gato e tipo. Para que eu poida executar gato students.txt | sort e prema Intro. E agora vemos o contido da students.txt en orde alfabética. Entón, imos engadir outro comando - uniq, ou única - ao noso pipeline. Como podes imaxinar, uniq, cando proporcionada unha secuencia ordenada de liñas a través de stdin, pode imprimir as liñas orixinais. Polo tanto, agora temos students.txt gato | Sort | uniq. Finalmente, podemos salvar a saída do gasoduto a un arquivo vía gato students.txt | sort | uniq > Final.txt. Entón, se abrirmos final.txt, temos exactamente o que nós buscar: unha lista de nomes exclusivos en orde alfabética, gardados nun arquivo de texto. A propósito, tamén podería ter dito tipo < students.txt | uniq> final.txt facer exactamente o mesmo, utilizando cada un dos operadores que xa vimos en este vídeo. O meu nome é Tommy, e este é o CS50.