先写个小工具
这个工具能从命令行读取用逗号分隔的数据,然后以JSON格式显示
#include <stdio.h>
int main() {
float latitude;
float longitude;
char info[80];
int started = 0;
puts("data=[");
while (scanf("%f,%f,%79[^\n]", &latitude,&longitude, info) == 3) {
if (started)
printf(",\n");
else
started = 1 ;
printf("{latitude: %f, longitude: %f, info: '%s'}", latitude, longitude, info);
}
puts("\n]");
return 0;
}
运行结果:
程序是工作了,但是输入和输出数据混作一团
。
对于大量数据来说,如果不用手工输入,而是能
从文件中直接读取,那就事半功倍了。
标准输入和标准输出
在用 scanf() 从键盘读取数据、printf() 向显示器写数据时,
这两个函数其实并没有直接使用键盘、显示器,而是用了标
准输入和标准输出。程序运行时,操作系统会创建标准输入
和标准输出。
操作系统控制数据如何进出标准输入、标准输出。如果在命令
提示符或终端运行程序,操作系统会把所有键盘输入都发送
到标准输入;默认情况下,如果操作系统从标准输出中读到
数据,就发送到显示器。
scanf() 和 printf() 函数并不知道数据从哪里来,也不知道
数据要到哪里去,它们也不关心这点,它们只管从标准输入
读数据,
向标准输出写数据。
听起来有些故弄玄虚,为什么不让程序直接使用键盘和屏幕
呢?岂不是更简单?
操作系统为什么要使用标准输入、标准输出与程序交互呢?有
一个很好的原因:
因为这么一来,就可以重定向标准输入、标准输出,让程序从键盘以外的地方读数据、往显示器以外的地方写数据,例如文件。
可以使用 < 操作符重定向标准输入
比如要读取下面的gpsdata.csv中的数据:可以用" 程序名<gpsdata.csv"
42.3634,-71.098465,Speed = 21
30.3634,-71.098465,Speed = 21
42.363327,-71.097588,Speed = 23
42.363255,-71.09671,Speed = 17
42.363182,-71.095833,Speed = 22
423.6311,-71.094955,Speed = 14
42.363037,-71.094078,Speed = 16
42.362965,-71.093201,Speed = 18
42.362892,-71.092323,Speed = 22
42.36282,-71.091446,Speed = 17
42.362747,-71.090569,Speed = 23
42.362675,-71.089691,Speed = 14
42.362602,-71.088814,Speed = 19
42.36253,-71.087936,Speed = 16
42.362457,-71.087059,Speed = 16
42.362385,-71.086182,Speed = 21
运行结果:
用 > 操作符重定向标准输出
比如把上面打印到屏幕的json数据输出到一个文本output.json中,可以用“
程序名 < gpsdata.csv > output.json
”命令
运行结果:
将新创建的数据文件在地图上画出坐标
1.打开这个地图网页:
http://chengyichao.info/hfc/ditu.html ,保存网页到本地
2.把刚才生成的
output.json文件拷贝到ditu_files文件夹中替换掉原有的output.json,然后用浏览器打
开网页。
结果确实标注出来了坐标。
刚打开网页会弹出这么一个错误提示,原因是原gpsdata.csv文件中有个latitude数据有问题,
解决这个问题,需要在转换的过程中进行数据检验。
需要注意的是,打印错误如果只用printf,那么错误信息也会被重定向到文件中,可以改用fprintf,
将错误重定向到标准错误stderr中。
标准错误默认的是输出到显示器,当然也可以用 2> 重定向标准错误,如:tojson 2> errors.txt,
这样错误信息就打印到了errors.txt文件中了。
#include <stdio.h>
int main() {
float latitude;
float longitude;
char info[80];
int started = 0;
puts("data=[");