HeadFirstC笔记_3 创建小工具:做一件事并把它做好

本文是HeadFirstC语言学习笔记的第三部分,主要介绍如何创建小型实用工具,专注于做好一件事,并探讨了如何利用管道进行进程间通信,结合标准输入输出来实现命令行工具的有效交互。
摘要由CSDN通过智能技术生成
先写个小工具
这个工具能从命令行读取用逗号分隔的数据,然后以JSON格式显示
   
   
   
  1. #include <stdio.h>
  2. int main() {
  3. float latitude;
  4. float longitude;
  5. char info[80];
  6. int started = 0;
  7. puts("data=[");
  8. while (scanf("%f,%f,%79[^\n]", &latitude,&longitude, info) == 3) {
  9. if (started)
  10. printf(",\n");
  11. else
  12. started = 1 ;
  13. printf("{latitude: %f, longitude: %f, info: '%s'}", latitude, longitude, info);
  14. }
  15. puts("\n]");
  16. return 0;
  17. }
运行结果:

程序是工作了,但是输入和输出数据混作一团
对于大量数据来说,如果不用手工输入,而是能 从文件中直接读取,那就事半功倍了。

标准输入和标准输出
       在用 scanf() 从键盘读取数据、printf() 向显示器写数据时, 这两个函数其实并没有直接使用键盘、显示器,而是用了标
准输入和标准输出。程序运行时,操作系统会创建标准输入 和标准输出。
       操作系统控制数据如何进出标准输入、标准输出。如果在命令 提示符或终端运行程序,操作系统会把所有键盘输入都发送
到标准输入;默认情况下,如果操作系统从标准输出中读到 数据,就发送到显示器。
       scanf() 和 printf() 函数并不知道数据从哪里来,也不知道 数据要到哪里去,它们也不关心这点,它们只管从标准输入 读数据,
向标准输出写数据。 听起来有些故弄玄虚,为什么不让程序直接使用键盘和屏幕 呢?岂不是更简单?
       操作系统为什么要使用标准输入、标准输出与程序交互呢?有 一个很好的原因:
因为这么一来,就可以重定向标准输入、标准输出,让程序从键盘以外的地方读数据、往显示器以外的地方写数据,例如文件。

可以使用 < 操作符重定向标准输入
比如要读取下面的gpsdata.csv中的数据:可以用" 程序名<gpsdata.csv"
     
     
     
  1. 42.3634,-71.098465,Speed = 21
  2. 30.3634,-71.098465,Speed = 21
  3. 42.363327,-71.097588,Speed = 23
  4. 42.363255,-71.09671,Speed = 17
  5. 42.363182,-71.095833,Speed = 22
  6. 423.6311,-71.094955,Speed = 14
  7. 42.363037,-71.094078,Speed = 16
  8. 42.362965,-71.093201,Speed = 18
  9. 42.362892,-71.092323,Speed = 22
  10. 42.36282,-71.091446,Speed = 17
  11. 42.362747,-71.090569,Speed = 23
  12. 42.362675,-71.089691,Speed = 14
  13. 42.362602,-71.088814,Speed = 19
  14. 42.36253,-71.087936,Speed = 16
  15. 42.362457,-71.087059,Speed = 16
  16. 42.362385,-71.086182,Speed = 21
运行结果:
 
用 > 操作符重定向标准输出
比如把上面打印到屏幕的json数据输出到一个文本output.json中,可以用“ 程序名 < gpsdata.csv > output.json ”命令
 
运行结果:
 
将新创建的数据文件在地图上画出坐标

2.把刚才生成的 output.json文件拷贝到ditu_files文件夹中替换掉原有的output.json,然后用浏览器打 开网页。
结果确实标注出来了坐标。
 
一些数据出错了

 刚打开网页会弹出这么一个错误提示,原因是原gpsdata.csv文件中有个latitude数据有问题,
解决这个问题,需要在转换的过程中进行数据检验。
需要注意的是,打印错误如果只用printf,那么错误信息也会被重定向到文件中,可以改用fprintf,
将错误重定向到标准错误stderr中。
标准错误默认的是输出到显示器,当然也可以用 2> 重定向标准错误,如:tojson 2> errors.txt,
这样错误信息就打印到了errors.txt文件中了。
       
       
       
  1. #include <stdio.h>
  2. int main() {
  3. float latitude;
  4. float longitude;
  5. char info[80];
  6. int started = 0;
  7. puts("data=[");
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值