Tip:
Highlight text to annotate it
X
[Powered by Google Translate] TOMMY:在这个视频中,我们将了解
重定向和管道。
到目前为止,我们一直在使用的功能,如printf来
输出到终端的数据和功能类似的GetString
以允许用户提供输入到我们的
程序中使用的键盘。
让我们赶紧来看看一个程序,得到了行
来自用户的输入,然后将其输出。
>> 在第7行,我们提示用户输入一个字符串,并
然后在第8行,我们要打印退了出去。
让编译和运行我们的程序。
大。
我们所提供的字符串被回
我们在终端。
这是因为printf函数的写信给
流称为标准输出,S-T-D-OUT。
当事情写入到标准输出,默认情况下,
显示由该终端。
>> 所以,这一切都很好,但如果,而不是简单地
显示字符串,我们希望将它保存到一个文件?
例如,我们可能要记得正是我们的
程序的时候,我们给了它一个特定的输入后。
有一种方法可以做到这一点在我们的C程序中,使用
写入文件的一些特殊功能,我们将
看到在另一个视频。
虽然,更容易,以某种方式将
重定向标准输出到一个文件中。
这样一来,当printf写入到stdout,其内容将
被写入文件,而不是
显示由该终端。
我们可以做到这一点,添加一个大于号,
一个文件名,命令,我们执行我们的程序。
>> 因此,而不是简单地执行。/重定向,我们可以
运行。/重定向,一个大于号,
名,例如file.txt的。
让我们看看会发生什么。
OK。
请注意,这时候,什么也没有显示在终端上,
但我们并没有修改的内容,我们
在所有的C程序。
现在,让我们来检查使用ls这个目录的内容。
>> 好的。
我们现在有一个新的名为file.txt的文件,在我们的目录,
这是我们提供的文件名,当我们运行我们的
重定向程序。
让我们打开file.txt的。
在这里,我们可以看到,标准输出重定向
写入文件名为file.txt的。
因此,让我们再次运行前面的命令,但提供一个
不同的输入时间。
好吧。
让我们来看看在file.txt的。
>> 在这里,我们可以看到该文件已被覆盖,所以我们
原来的输入是不存在了。
如果我们不是要追加到这个文件,把新的
输入下面的现有文件的内容,我们可以
使用两个大于符号,而不是只有一个。
让我们试试吧。
现在,如果我们再次打开file.txt的,我们可以看到我们的
输入线。
在某些情况下,我们可能要放弃任何
输出我们的计划。
而不是写输出到一个文件,然后删除
我们已经完成了它的文件时,我们可以写一个特殊的
文件名为/ dev / null的。
什么是写入/ dev/null--
或只是devnull短 -
它被自动丢弃。
因此,认为devnull的黑洞,为您的数据。
>> 所以,现在我们已经看到了如何用大于号可以重定向
标准输出,让我们看看如何可以重定向标准 -
或s-叔的d -
标准输出的模拟。
虽然功能同于printf写的流称为
从流中读取标准输出,的GetString和类似功能
称为stdin,默认情况下,是流
在键盘上输入的字符。
使用小于号,我们可以重定向标准输入,
一个文件名。
现在,而不是在提示用户输入
终端,程序将打开我们指定的文件,并使用
它的线条作为输入。
>> 让我们看看会发生什么。
大。
已打印的第一行file.txt的到终端
因为我们调用GetString的一次。
如果我们有另一个在我们的程序中调用GetString的,
file.txt的下一行已被用来作为
输入到该呼叫。
同样,我们没有改变我们的C程序在所有。
我们只是改变了我们运行它。
还记得,我们没有重定向标准输出时间,
所以输出的程序的时间是仍
显示在终端上。
当然,我们可以都重定向标准输入
和stdout是这样的。
现在,file2.txt包含file.txt的的第一行。
>> 因此,使用这些运营商,我们已经能够阅读和
写文本文件。
现在,让我们来看看如何,我们可以使用一个程序的输出
另一个程序的输入。
因此,这里是另一个简单的C程序,我
这里有名为hello.c。
正如你可以看到,这只是输出“嗨,
那里!“给用户。
如果我想重定向到使用作为输入输出的Hello -
另一种方案 -
我可以先输出重定向到一个文件名为hello的
INPUT.TXT,然后重定向标准输入重定向到相同的
文件 - INPUT.TXT。
所以我可以做。/你好INPUT.TXT。
按Enter键执行。
其次/重定向<
INPUT.TXT,并执行它。
因此,我们可以缩短这个有点用分号,这使得
我们在同一行上运行两个或多个命令。
所以我可以说,。/你好INPUT.TXT,分号,
/重定向> 所以这个作品,但它仍然感觉非常不雅。
我的意思是,我们真的需要这种中介的文本文件,该文件
重定向运行后,不再需要吗?
幸运的是,我们可以避免这种额外的文本文件,使用的是什么
称为管道。
如果我说/你好| /重定向,然后在标准输出
在左边的程序 -
在这种情况下,你好 -
将被用作标准输入
程序上的权利。
在这种情况下,重定向。因此,让我们运行这个。
>> 我们走吧。
我们可以看到,作为输入输出的Hello
为重定向。
拉丝命令一起使用管道,我们形成什么
所谓的管道,因为我们的产量基本上是移动
通过一个命令序列。
使用管道,我们可以做一些很酷的东西,而不需要
写任何代码。
例如,让我们说,我们想知道有多少文件
这个目录里面。
使用管道,我们可以将ls命令与WC -
或wordcount的 -
命令。
ls将输出到标准输出的目录中的每个文件,并
厕所会告诉我们有多少行,它通过标准输入。
所以,如果我们说LS WC-L -
到wc-l标志,告诉它计算行数 -
我们可以看到到底有多少文件
在当前目录中。
>> 因此,让我们来看看一个例子。
我这里有一个名为students.txt,
的名称的列表。
但是,这些名称都没有任何顺序,它的外观
像几个名字是重复的。
我们要的是一个唯一的名称列表按字母
为了保存到一个名为final.txt。
当然,我们可以写一个C程序来为我们做这。
但它会得到不必要的
复杂的很快。
让我们,而不是使用管道和一些内置的工具来解决
这个问题。
>> 我们需要做的第一件事情是读取该文件students.txt。
cat命令将做到这一点。
这将在指定的文件中读取和写入
其内容输出到stdout。
我们已经阅读过的文本文件后,我们会
要排序的名称。
sort命令可以处理给我们看。
的排序将输出线通过提供标准输入到标准输出(stdout)
在排序顺序。
为了提供内容students.txt
排序的stdin,我们可以使用一个管结合猫和排序。
所以,我可以执行cat students.txt的排序|和
然后按Enter键。
而现在,我们看到的内容students.txt
按字母顺序排列。
>> 所以,让我们添加另一个命令 -
uniq的,或独特的 -
我们的管道。
正如你可能已经猜到,uniq中,提供了一个排序序列
线通过标准输入,输出的独特线条。
所以现在我们有猫students.txt
|排序| uniq的。
最后,我们可以节省的管道输出到
猫students.txt |排序| uniq的文件通过
> final.txt。
所以,如果我们打开了final.txt的,我们有什么,我们
寻找:
唯一的名称按字母顺序排列的列表,
保存到一个文本文件中。
顺便说一下,我们也可以说排序<
students.txt | uniq的final.txt做到底
同样的事情,我们已经看到在使用每个运营商
这部影片。
>> 我的名字是汤米,这是CS50。