Head First C (1) 数据流

需要非扫描版高清pdf请私信我哦~

标准输入、标准输出和标准错误

程序运行时,操作系统会创建标准输入、标准输出和标准错误,它会把标准输入指向键盘,把从标准输出和标准错误读到的数据发送到显示器。

scanf() 和 printf() 这两个函数就是用了标准输入和标准输出,从键盘读取数据,并向显示器写数据。它们并没有直接使用键盘和显示器,是操作系统控制数据如何进出标准输入、标准输出。如果在命令提示符或终端运行程序,操作系统会把所有键盘输入都发送到标准输入;默认情况下,如果操作系统从标准输出中读到数据,就发送到显示器。

fprintf():printf() 函数可以将数据发送到标准输出,但 printf() 其实只是一个函数的特例,而这个函数叫 fprintf() 。fprintf() 函数可以让你决定把文本发送到哪里,你既可以让 fprintf() 把文本发送到 stdout(标准输出),也可以发送到 stderr(标准错误)。

fscanf():既然有 stdout 和 stderr,自然有 stdin,它代表标准输入。scanf() 可以从标准输入读取数据,它是由 fscanf() 实现的。它们用法很像,区别是可以指定 fscanf() 从哪条数据流中读数据。

重定向

scanf() 和 printf() 函数并不知道数据从哪里来,也不知道数据要到哪里去,它们也不关心这点,它们只管从标准输入读数据,向标准输出写数据。为什么不让程序直接使用键盘和屏幕呢?岂不是更简单?操作系统为什么要使用标准输入、标准输出与程序交互呢?有一个很好的原因:因为这么一来,就可以重定向标准输入、标准输出,让程序从键盘以外的地方读数据、往显示器以外的地方写数据,例如文件。

可以用 < 重定向标准输入,用 > 重定向标准输出,2>重定向标准错误。例如:

> ./geo2json < gpsdata.csv > output.json 2> errors.txt
用管道连接输入与输出

如果我们想在 geo2json 小工具的基础上给它添加一些额外功能,为了能够保证其独立性,我们不能修改原有工具,而是创建一个新的 bermuda 工具。要把bermuda工具的标准输出连接到geo2json工具的标准输入。

符号 | 表示管道(pipe),它能连接一个进程的标准输出与另一个进程的标准输入。操作系统会处理管道的细节,我们要做的就是输入一条这样的命令:

(./bermuda | ./geo2json) < spooky.csv > output.json
创建自己的数据流

程序运行时,操作系统会为它创建三条数据流:标准输入、标准输出和标准错误。但有时你需要创建自己的数据流。好在操作系统没有规定只能使用它分配的三条数据流,你可以在程序运行时创建自己的数据流。每条数据流用一个指向文件的指针来表示,可以用 fopen() 函数创建新数据流。

FILE *in_file = fopen("input.txt", "r");
FILE *out_file = fopen("output.txt", "w");

最后,当用完数据流,别忘了关闭它。虽然所有的数据流在程序结束后都会自动关闭,但你仍应该自己关闭它们:

fclose(in_file);
fclose(out_file);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值