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