返回介绍

可以用重定向

发布于 2024-10-10 23:21:24 字数 3921 浏览 0 评论 0 收藏 0

在用

scanf() 从键盘读取数据、printf() 向显示器写数据时,这两个函数其实并没有直接使用键盘、显示器,而是用了标准输入和标准输出。程序运行时,操作系统会创建标准输入和标准输出。

操作系统控制数据如何进出标准输入、标准输出。如果在命令提示符或终端运行程序,操作系统会把所有键盘输入都发送到标准输入;默认情况下,如果操作系统从标准输出中读到数据,就发送到显示器。

scanf() 和 printf() 函数并不知道数据从哪里来,也不知道数据要到哪里去,它们也不关心这点,它们只管从标准输入读数据,向标准输出写数据。

听起来有些故弄玄虚,为什么不让程序直接使用键盘和屏幕呢?岂不是更简单?

操作系统为什么要使用标准输入、标准输出与程序交互呢?有一个很好的原因:

因为这么一来,就可以重定向标准输入、标准输出,让程序从键盘以外的地方读数据、往显示器以外的地方写数据,例如文件。

可以用 < 重定向标准输入……

你不必再用键盘输入数据,可以使用 < 操作符从文件中读取数据。

<操作符告诉操作系统,程序的标准输入应该与 gpsdata.csv 文件相连,而不是键盘,所以可以把数据从文件发送到程序。现在只需重定向程序的输出。

用 > 重定向标准输出

为了把标准输出重定向到文件,需要使用 > 操作符:

因为重定向了标准输出,所以屏幕上没有出现任何数据,程序现在创建了一个叫 output.json 的文件。

地图应用需要用到 output.json 文件,让我们看看地图能否工作。

 

试驾

试试新创建的数据文件能否在地图上画出坐标,把含有地图程序的网页复制到 output.json 所在的文件夹中,然后用浏览器打开网页。

地图工作了。

网页中的地图成功读取了输出文件中的数据。

一些数据出错了……

程序已经能够顺利读取 GPS 数据,并把数据转化为地图应用需要的格式。但是几天以后,程序出现了一个问题。

geo2json 程序并不会检查读入的数据,它只是改变数字的格式,然后把它们发送到输出文件。

这个问题应该不难解决,你需要校验数据。

练习

你需要在 geo2json 程序中添加一些代码,用来检查错误的经、纬度值。无需任何高深的技巧。假如经度或纬度不在指定的范围内,就显示一条错误消息,并在退出程序的同时把错误状态码置为 2:

 

练习

你在 geo2json 程序中添加一些代码,用来检查错误的经、纬度值。假如经度或纬度不在指定的范围内,就显示一条错误消息,并在退出程序的同时把错误状态码置为 2:

试驾

好啦,代码现在可以检查经度、纬度的范围了,程序能发现错误数据吗?我们拭目以待。

编译代码,使用错误数据作输入,运行程序:

太奇怪了,明明加了检查错误的代码,但运行程序时,一切还是老样子,但这次地图上一个坐标都没有,这是为什么?

脑力风暴

好好研究一下这段代码,你认为发生了什么?代码有没有照你说的去做?为什么连一条错误消息都没有?为什么地图应用认为整个 output.json 文件是错的?

代码拆析

既然地图程序在埋怨 output.json 文件,那我们就打开它,看看里面是什么:

一打开文件,你就可以看得一清二楚。当程序一看到错误数据就马上退出了,它不再继续处理数据,而是输出了一条错误消息。当把标准输出重定向到 output.json,也重定向了错误消息,于是程序一声不吭地结束,你永远不知道问题出在哪里。

如果你看得到错误消息,就会去检查程序的退出状态,但你现在连程序出错了都不知道。

怎样才能在重定向输出的同时显示错误消息呢?

百宝箱

程序在数据中发现错误就会退出,并把退出状态置为 2。怎么在程序结束后检查错误状态呢?要看操作系统,如果你的计算机是 Mac、Linux、其他 UNIX,或你在 Windows 上使用 Cygwin,可以用以下命令显示错误状态:如果用的是 Windows 的命令提示符,则可以输入:这两条命令做了相同的事:显示程序结束时返回的那个数字。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文