Tip:
Highlight text to annotate it
X
[Powered by Google Translate] TOMMY: Dalam video ini, kita akan belajar tentang
mengalihkan dan paip.
Setakat ini, kami telah menggunakan fungsi seperti printf
output data ke terminal dan fungsi seperti GetString
untuk membenarkan pengguna untuk memberi input kepada kami
program menggunakan keyboard.
Mari cepat mengambil melihat pada program yang mendapat garis
input daripada pengguna dan kemudian output.
>> On line 7, kami mendorong pengguna untuk rentetan, dan
kemudian on line 8, kita mencetak kembali keluar.
Mari menyusun dan menjalankan program kami.
Besar.
Rentetan yang kita berikan telah bergema kembali
kepada kami di terminal.
Ini berlaku kerana fungsi printf menulis kepada
aliran dipanggil keluar standard, atau s-t-d keluar.
Apabila sesuatu yang bertulis kepada stdout, ia adalah secara lalai
dipaparkan oleh terminal.
>> Jadi itulah semua baik dan baik, tetapi apa yang jika, bukan sekadar
memaparkan rentetan, kita mahu menyimpannya ke fail?
Sebagai contoh, kita mungkin mahu ingat dengan tepat apa yang kami
program lakukan apabila kita memberikan input tertentu kemudian.
Salah satu pendekatan yang akan melakukan ini dalam program C kami, dengan menggunakan
beberapa fungsi khas untuk menulis kepada fail bahawa kami akan
lihat dalam video lain.
Lebih mudah, walaupun, akan entah bagaimana
redirect stdout ke fail.
Cara itu, apabila printf menulis stdout, kandungannya akan
bertulis kepada fail bukannya
dipaparkan oleh terminal.
Kita boleh berbuat demikian dengan menambah tanda yang lebih besar daripada, diikuti
oleh nama fail, arahan kita gunakan untuk melaksanakan program kami.
>> Jadi, bukan sekadar melaksanakan. / Redirect, kita boleh
berlari. / redirect, diikuti oleh lebih daripada tanda, diikuti oleh
nama fail, seperti file.txt.
Mari kita lihat apa yang berlaku.
OK.
Perhatikan bahawa masa ini, tiada apa yang telah dipaparkan di terminal,
tetapi kita telah tidak diubah suai kandungan kami
Aturcara C pada semua.
Mari kita kini meneliti kandungan direktori ini dengan ls.
>> Semua hak.
Kami kini mempunyai fail baru dalam direktori kami dipanggil file.txt,
yang merupakan nama fail yang kita dibekalkan apabila kita berlari kita
Redirect program.
Mari kita membuka file.txt.
Dan di sini, kita dapat melihat bahawa stdout daripada redirect
ditulis fail dipanggil file.txt.
Jadi mari kita jalankan arahan sebelumnya lagi, tetapi membekalkan
input berbeza kali ini.
Okay.
Mari kita melihat file.txt sekarang.
>> Kita boleh lihat di sini bahawa fail telah ditulis ganti, jadi kita
input asal tidak ada lagi.
Jika kita bukannya mahu untuk melampirkan ke fail ini, meletakkan yang baru
input di bawah kandungan sedia ada fail, kita boleh
menggunakan dua tanda-tanda yang lebih besar daripada bukan hanya satu.
Mari kita cuba.
Sekarang, jika kita membuka file.txt lagi, kita boleh melihat kedua-dua kami
input baris.
Dalam beberapa kes, kita mungkin mahu untuk membuang mana-mana
output program kami.
Bukannya menulis output ke fail dan kemudian memotong
fail apabila kita hendak dilakukan dengan ia, kita boleh menulis kepada khas
file dipanggil / dev / null.
Apabila apa-apa yang ditulis ke / dev/null--
atau hanya devnull bagi pendek -
ia secara automatik dibuang.
Jadi berfikir devnull sebagai lubang hitam untuk data anda.
>> Jadi sekarang kita telah melihat bagaimana tanda yang lebih besar daripada boleh mengarahkan
stdout, mari kita lihat bagaimana kita boleh redirect standard dalam -
atau s-t-d-dalam
analog stdout.
Walaupun fungsi printf suka menulis kepada aliran yang dipanggil
stdout, GetString dan fungsi yang sama yang dibaca dari sungai
dipanggil stdin, yang, secara lalai, ialah aliran
watak-watak yang ditaip pada keyboard.
Kita boleh mengalihkan stdin menggunakan kurang daripada tanda, diikuti
mengikut nama fail.
Sekarang, bukannya mendorong pengguna untuk input pada
terminal, program akan membuka fail kita dinyatakan dan menggunakan
garisan itu sebagai input.
>> Mari kita lihat apa yang berlaku.
Besar.
Barisan pertama file.txt telah dicetak ke terminal
kerana kita sedang memanggil GetString sekali.
Jika kita mempunyai panggilan lain ke GetString dalam program kami,
Barisan seterusnya file.txt akan telah digunakan sebagai
input kepada panggilan itu.
Sekali lagi, kita tidak diubah suai aturcara C kita pada semua.
Kami hanya mengubah bagaimana kita jalankan ia.
Dan juga ingat, kita tidak diarahkan stdout masa ini,
jadi output program masih
dipaparkan di terminal.
Kita boleh, sudah tentu, mengarahkan kedua-dua stdin
dan stdout seperti ini.
Sekarang, file2.txt mengandungi barisan pertama file.txt.
>> Jadi, menggunakan operator, kita telah dapat membaca dan
menulis dari fail teks.
Sekarang, mari kita lihat bagaimana kita boleh menggunakan output satu program sebagai
input untuk program lain.
Jadi di sini adalah satu lagi program C mudah saya
di sini dipanggil hello.c.
Seperti yang anda boleh lihat, ini hanya output "Hi
sana! "kepada pengguna.
Jika saya mahu redirect untuk digunakan sebagai input output hello -
satu lagi program -
Saya pertama boleh redirect stdout-hello kepada fail yang dipanggil
input.txt, maka mengalihkan stdin redirect yang sama
fail - input.txt.
Jadi saya boleh lakukan. / Hello> input.txt.
Tekan Enter untuk melaksanakan ini.
Diikuti oleh. / Mengalihkan <
input.txt, dan melaksanakan bahawa.
Jadi kita boleh memendekkan sedikit ini dengan semicolon, yang membolehkan
kita untuk menjalankan dua atau lebih arahan pada baris yang sama.
Jadi yang boleh saya katakan. / Hello> input.txt, koma bernoktah,
/ Redirect input.txt > Jadi kerja-kerja ini, tetapi ia masih berasa agak kaku.
Maksud saya, adakah kita benar-benar memerlukan fail ini perantara teks yang
tidak lagi perlu selepas redirect berjalan?
Nasib baik, kita boleh mengelakkan fail teks tambahan ini menggunakan apa yang
dipanggil paip.
Jika saya katakan, / hello |. / Redirect, maka stdout
program di sebelah kiri -
dalam kes ini, hello -
akan digunakan sebagai input standard untuk
program di sebelah kanan.
Dalam kes ini, redirect. Jadi mari kita berjalan ini.
>> Terdapat kita pergi.
Kita dapat melihat bahawa output hello digunakan sebagai input
untuk redirect.
Dengan arahan stringing bersama-sama menggunakan paip, kita membentuk apa
dipanggil saluran paip, sejak output dasarnya bergerak
melalui urutan arahan.
Menggunakan paip, yang boleh kita lakukan beberapa barangan sejuk tanpa perlu
menulis apa-apa kod pada semua.
Sebagai contoh, katakan kita mahu tahu berapa banyak fail
di dalam direktori ini.
Menggunakan paip, kita boleh menggabungkan arahan ls dengan tandas -
atau Wordcount -
arahan.
Ls akan output setiap fail dalam direktori untuk stdout, dan
wc akan memberitahu kita berapa banyak baris diberikan melalui stdin.
Jadi, jika kita katakan ls | wc-l -
membekalkan l bendera ke tandas untuk memberitahu ia untuk mengira baris -
kita boleh melihat dengan tepat berapa banyak fail
dalam direktori semasa.
>> Jadi mari kita lihat pada satu lagi contoh.
Saya ada di sini fail yang dipanggil students.txt,
dengan senarai nama.
Walau bagaimanapun, nama-nama ini tidak berada dalam mana-mana perintah yang ia semua, dan ia kelihatan
seperti beberapa nama diulangi.
Apa yang kita mahu adalah senarai nama-nama yang unik dalam abjad
perintah, disimpan untuk fail yang dipanggil final.txt.
Kita boleh, sudah tentu, menulis program C untuk melakukan ini untuk kita.
Tetapi ia akan mendapat tidak perlu
kompleks agak cepat.
Mari kita sebaliknya menggunakan paip dan beberapa terbina dalam alat untuk menyelesaikan
masalah ini.
>> Perkara pertama yang perlu kita lakukan adalah membaca students.txt fail.
Arahan kucing akan berbuat demikian.
Ia akan membaca fail yang dinyatakan dan menulis
kandungannya ke stdout.
Selepas kita telah membaca fail teks, kami akan
mahu menyusun nama.
Arahan apapun boleh mengendalikan ini untuk kita.
Susun akan keluar barisan yang dibekalkan melalui stdin kepada stdout
dalam perintah disusun.
Dalam usaha untuk membekalkan kandungan students.txt
stdin apapun, kita boleh menggunakan paip untuk menggabungkan kucing dan apapun.
Jadi saya boleh melaksanakan kucing students.txt | menyusun dan
tekan Enter.
Dan sekarang, kita lihat kandungan students.txt
abjad.
>> Jadi mari kita menambah arahan lain -
uniq, atau unik -
kepada talian paip kita.
Seperti yang anda sangka, uniq, apabila dibekalkan jujukan disusun
baris melalui stdin, akan mengeluarkan garis unik.
Jadi sekarang kita mempunyai students.txt kucing
| Apapun | uniq.
Akhirnya, kita dapat menjimatkan output perancangan untuk
fail melalui kucing students.txt | apapun | uniq
> Final.txt.
Jadi, jika kita membuka final.txt, kita mempunyai apa yang kita
mencari:
senarai nama yang unik dalam susunan abjad,
disimpan ke fail teks.
By the way, kita juga boleh berkata apapun <
students.txt | uniq> final.txt untuk melakukan dengan tepat
perkara yang sama, menggunakan setiap pengendali yang kita lihat dalam
video ini.
>> Nama saya adalah Tommy, dan ini adalah CS50.