[Powered by Google Translate] TOMMY: Trong video này, chúng ta sẽ tìm hiểu về
chuyển hướng và đường ống.
Cho đến nay, chúng tôi đã sử dụng các chức năng như printf
dữ liệu đầu ra thiết bị đầu cuối và các chức năng như GetString
để cho phép người sử dụng để cung cấp đầu vào của chúng tôi
chương trình bằng cách sử dụng bàn phím.
Hãy nhanh chóng lấy một cái nhìn tại một chương trình nhận được một dòng
đầu vào từ người dùng và sau đó kết quả đầu ra.
>> On line 7, chúng tôi đang khiến người sử dụng cho một chuỗi, và
sau đó trên hàng 8, chúng tôi đang in nó trở lại ra ngoài.
Hãy để biên dịch và chạy chương trình của chúng tôi.
Lớn.
Chuỗi chúng tôi cung cấp được lặp lại
cho chúng tôi tại các thiết bị đầu cuối.
Điều này xảy ra bởi vì chức năng printf viết cho một
dòng gọi là tiêu chuẩn ra ngoài, hoặc s-t-d-out.
Khi một cái gì đó được viết vào thiết bị xuất chuẩn, đó là theo mặc định
hiển thị bởi thiết bị đầu cuối.
>> Vì vậy, đó là tất cả tốt và tốt, nhưng những gì nếu, thay vì chỉ
hiển thị chuỗi, chúng tôi muốn để lưu nó vào một tập tin?
Ví dụ, chúng ta cần phải nhớ chính xác những gì chúng tôi
chương trình đã làm khi chúng tôi đã cho nó một đầu vào cụ thể sau.
Một cách tiếp cận sẽ được để làm điều này trong chương trình C của chúng tôi, bằng cách sử dụng
một số chức năng đặc biệt để ghi vào tập tin rằng chúng tôi sẽ
xem trong video khác.
Dễ dàng hơn, tuy nhiên, sẽ là bằng cách nào đó
chuyển hướng stdout vào một tập tin.
Bằng cách đó, khi printf ghi vào thiết bị xuất chuẩn, nội dung sẽ
được viết vào một tập tin chứ không phải là
hiển thị bởi thiết bị đầu cuối.
Chúng ta có thể làm điều đó bằng cách thêm một dấu hiệu lớn hơn, tiếp
bởi một tên tập tin, lệnh chúng tôi sử dụng để thực hiện chương trình của chúng tôi.
>> Vì vậy, thay vì chỉ đơn giản là thực hiện / chuyển hướng, chúng ta có thể
chạy / chuyển hướng, tiếp theo lớn hơn dấu hiệu, tiếp theo
tên tập tin, như file.txt.
Hãy xem những gì xảy ra.
OK.
Chú ý rằng thời gian này, không có gì được hiển thị ở thiết bị đầu cuối,
nhưng chúng tôi đã không được sửa đổi nội dung của chúng tôi
C chương trình ở tất cả.
Bây giờ chúng ta hãy kiểm tra các nội dung của thư mục này với ls.
>> Được rồi.
Bây giờ chúng ta có một tập tin mới trong thư mục của chúng tôi được gọi là file.txt,
đó là tên tập tin chúng tôi cung cấp khi chúng tôi chạy của chúng tôi
Chuyển hướng chương trình.
Hãy mở ra file.txt.
Và ở đây, chúng ta có thể thấy rằng thiết bị xuất chuẩn của chuyển hướng
bằng văn bản cho các tập tin được gọi là file.txt.
Vì vậy, hãy chạy lệnh trước đó một lần nữa, nhưng cung cấp một
khác nhau vào thời điểm này.
Okay.
Hãy có một cái nhìn tại file.txt.
>> Chúng ta có thể thấy ở đây rằng các tập tin đã được ghi đè, do đó, chúng tôi
ban đầu vào là không còn ở đó nữa.
Nếu chúng ta thay vì muốn nối thêm vào tập tin này, đặt mới
đầu vào dưới đây các nội dung của tập tin hiện có, chúng tôi có thể
sử dụng hai dấu lớn hơn thay vì chỉ một.
Hãy cố gắng đó.
Bây giờ, nếu chúng ta mở file.txt một lần nữa, chúng ta có thể nhìn thấy cả hai của chúng tôi
đầu vào dòng.
Trong một số trường hợp, chúng tôi có thể muốn loại bỏ bất kỳ
đầu ra của chương trình của chúng tôi.
Thay vì viết đầu ra vào một tập tin và sau đó xóa
các tập tin khi chúng tôi đang thực hiện với nó, chúng tôi có thể viết một để đặc biệt
tập tin gọi là / dev / null.
Khi bất cứ điều gì được ghi vào / dev/null--
hoặc chỉ devnull tắt -
nó sẽ tự động bị loại bỏ.
Vì vậy, suy nghĩ của devnull như một lỗ đen cho dữ liệu của bạn.
>> Vì vậy, bây giờ chúng tôi đã nhìn thấy dấu hiệu lớn hơn như thế nào có thể chuyển hướng
stdout, chúng ta hãy xem làm thế nào chúng ta có thể chuyển hướng tiêu chuẩn trong -
hoặc s-t-d-trong
tương tự của thiết bị xuất chuẩn.
Trong khi chức năng như printf viết thư cho các dòng được gọi là
stdout, GetString và các chức năng tương tự đọc từ suối
gọi là stdin, trong đó, theo mặc định, là dòng
ký tự gõ vào bàn phím.
Chúng tôi có thể chuyển hướng stdin bằng cách sử dụng dấu nhỏ hơn, tiếp
một tên tập tin.
Bây giờ, hơn là khiến người sử dụng cho đầu vào tại
thiết bị đầu cuối, một chương trình sẽ mở các tập tin chúng tôi quy định và sử dụng
dòng của nó như là đầu vào.
>> Hãy xem những gì xảy ra.
Lớn.
Dòng đầu tiên của file.txt đã được in đến nhà ga
bởi vì chúng tôi đang gọi điện thoại GetString một lần.
Nếu chúng ta có một cuộc gọi đến GetString trong chương trình của chúng tôi,
dòng tiếp theo của file.txt sẽ được sử dụng như
đầu vào cho cuộc gọi đó.
Một lần nữa, chúng tôi đã không được sửa đổi chương trình C của chúng tôi tất cả.
Chúng tôi chỉ thay đổi cách chúng ta chạy nó.
Và cũng nhớ, chúng tôi đã không chuyển hướng stdout thời gian này,
do đó, đầu ra của chương trình vẫn còn
hiển thị ở thiết bị đầu cuối.
Chúng ta có thể, tất nhiên, chuyển hướng cả hai thiết bị nhập chuẩn
và thiết bị xuất chuẩn như thế này.
Bây giờ, file2.txt chứa dòng đầu tiên của file.txt.
>> Vì vậy, bằng cách sử dụng các nhà khai thác, chúng tôi đã có thể đọc và
viết từ các tập tin văn bản.
Bây giờ, chúng ta hãy xem làm thế nào chúng ta có thể sử dụng đầu ra của một chương trình
đầu vào cho chương trình khác.
Vì vậy, đây là một chương trình C đơn giản khác
ở đây gọi là hello.c.
Như bạn có thể thấy, đây chỉ đơn giản là kết quả đầu ra "Hi
"cho người sử dụng!
Nếu tôi muốn chuyển hướng sử dụng như là đầu vào đầu ra của hello -
chương trình khác -
Lần đầu tiên tôi có thể chuyển hướng stdout của hello một tập tin gọi là
INPUT.TXT, sau đó chuyển hướng stdin của chuyển hướng cho rằng cùng
file INPUT.TXT
Vì vậy, tôi có thể làm. / Hello> INPUT.TXT.
Nhấn Enter để thực hiện điều này.
Tiếp theo / chuyển hướng <
INPUT.TXT, và thực hiện điều đó.
Vì vậy, chúng ta có thể rút ngắn một chút với một dấu chấm phẩy, cho phép
chúng tôi chạy hai hoặc nhiều lệnh trên cùng một dòng.
Vì vậy, tôi có thể nói, / hello> INPUT.TXT, dấu chấm phẩy,
/ Chuyển hướng <INPUT.TXT.
>> Vì vậy, công trình này, nhưng nó vẫn cảm thấy khá không thanh nha.
Ý tôi là, chúng ta thực sự cần tập tin văn bản trung gian đó là
không còn cần thiết sau khi chuyển hướng chạy?
May mắn thay, chúng ta có thể tránh điều này thêm văn bản tập tin bằng cách sử dụng những gì
được gọi là một đường ống.
Nếu tôi nói, / hello |. / Chuyển hướng, sau đó là thiết bị xuất chuẩn của
các chương trình trên bên trái -
trong trường hợp này, hello -
sẽ được sử dụng như là đầu vào tiêu chuẩn cho các
chương trình trên bên phải.
Trong trường hợp này, chuyển hướng. Vì vậy, chúng ta hãy chạy.
>> Hiện chúng tôi đi.
Chúng ta có thể thấy rằng sản lượng của hello đã được sử dụng như là đầu vào
cho chuyển hướng.
By chuỗi lệnh với nhau bằng cách sử dụng đường ống, chúng tôi hình thành những gì
được gọi là một đường ống dẫn, kể từ khi sản lượng của chúng tôi chủ yếu là di chuyển
thông qua một chuỗi các lệnh.
Sử dụng đường ống, chúng ta có thể làm một số công cụ mát mẻ mà không cần phải
viết bất kỳ mã nào cả.
Ví dụ, hãy nói rằng chúng tôi muốn biết bao nhiêu tập tin
bên trong thư mục này.
Sử dụng một đường ống, chúng ta có thể kết hợp lệnh ls với wc
hoặc wordcount -
lệnh.
Ls sẽ sản xuất mỗi tập tin trong thư mục vào thiết bị xuất chuẩn, và
wc sẽ cho chúng ta biết có bao nhiêu dòng đã được trao cho nó thông qua stdin.
Vì vậy, nếu chúng ta nói ls | wc-l -
cung cấp các l-cờ wc để cho nó để đếm dòng -
chúng ta có thể thấy chính xác bao nhiêu tập tin
trong thư mục hiện hành.
>> Vì vậy, chúng ta hãy xem xét thêm một ví dụ.
Tôi đã ở đây một tập tin gọi students.txt,
với một danh sách các tên.
Tuy nhiên, các tên này không phải trong bất kỳ thứ tự tất cả, và có vẻ
như một vài tên được lặp đi lặp lại.
Những gì chúng tôi muốn là một danh sách các tên duy nhất trong bảng chữ cái
trật tự, lưu vào một tập tin gọi là final.txt.
Chúng ta có thể, tất nhiên, viết một chương trình C để làm điều này cho chúng tôi.
Nhưng nó sẽ trở nên không cần thiết
khá phức tạp một cách nhanh chóng.
Hãy thay vì sử dụng ống và một số được xây dựng trong các công cụ để giải quyết
vấn đề này.
>> Điều đầu tiên chúng ta cần làm là đọc students.txt tập tin.
Lệnh cat sẽ làm điều đó.
Nó sẽ đọc trong tập tin chỉ định và viết
nội dung của nó vào thiết bị xuất chuẩn.
Sau khi chúng tôi đã đọc các tập tin văn bản, chúng tôi sẽ
muốn sắp xếp tên.
Lệnh sắp xếp có thể xử lý này cho chúng tôi.
Sắp xếp sẽ sản xuất dòng cung cấp thông qua stdin vào thiết bị xuất chuẩn
theo thứ tự sắp xếp.
Để cung cấp nội dung của students.txt
loại của stdin, chúng ta có thể sử dụng một ống để kết hợp mèo và sắp xếp.
Vì vậy, tôi có thể thực hiện mèo students.txt | sắp xếp và
nhấn Enter.
Và bây giờ, chúng ta thấy nội dung của students.txt
thứ tự chữ cái.
>> Vì vậy, chúng ta hãy thêm một lệnh -
uniq, hoặc độc đáo
đường ống của chúng tôi.
Như bạn có thể đoán, uniq, khi được cung cấp một trình tự sắp xếp của
dòng thông qua stdin, sẽ sản xuất các dòng duy nhất.
Vì vậy, bây giờ chúng tôi có students.txt mèo
| Sort | uniq.
Cuối cùng, chúng ta có thể tiết kiệm đầu ra của các đường ống dẫn đến một
tập tin thông qua con mèo students.txt | sort | uniq
> Final.txt.
Vì vậy, nếu chúng ta mở ra final.txt, chúng tôi có chính xác những gì chúng tôi đã
tìm kiếm
một danh sách các tên duy nhất trong thứ tự chữ cái,
lưu vào một tập tin văn bản.
Bằng cách này, chúng ta cũng có thể nói sort <
students.txt | uniq> final.txt để làm chính xác
điều tương tự, bằng cách sử dụng của các nhà khai thác chúng ta đã thấy
video này.
>> Tên tôi là Tommy, và điều này là CS50.