我正在书中练习Head First C。我仔细检查了我的代码与书中的代码是否相同,我正在仔细地按照书中的步骤进行操作。
C文件应该采用gps数据并以JSON样式格式化。
#include <stdio.h>
int main() {
float latitude;
float longitude;
char info[40];
int started = 0;
puts("data=[");
while (scanf("%f, %f, %39[^\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;
}
首先,本书让我们输入数据,向我们展示它看起来多么乏味和格式化,然后我们学习重定向stdin来读取逗号分隔数据的文件,如下所示:
$ ./geo2json < gpsdata.csv
我无法在线查找源文件,因此我从本书的pdf中复制/粘贴以创建csv文件。
gpsdata.csv and gpsdata.txt
42.363400,-71.098465,Speed = 21
42.363327,-71.097588,Speed = 23
42.363255,-71.096710,Speed = 17
42.363182,-71.095833,Speed = 22
42.363110,-71.094955,Speed = 14
42.363037,-71.094078,Speed = 16
42.362965,-71.093201,Speed = 18
42.362892,-71.092323,Speed = 22
42.362820,-71.091446,Speed = 17
42.362747,-71.090569,Speed = 23
42.362675,-71.089691,Speed = 14
42.362602,-71.088814,Speed = 19
42.362530,-71.087936,Speed = 16
42.362457,-71.087059,Speed = 16
42.362385,-71.086182,Speed = 21
奇怪的事情发生了,所以我通过线路删除然后重新进入换行符,以防有一些隐藏的格式。我尝试将文件类型从.csv更改为.txt。两者都没有区别。当我输入数据时,这种奇怪现象没有发生。
应该如何看待:
它看起来如何。注意最后一行是如何不同的。顺便说一句,有时纬度上的'l'出现在最后一行。
login:~/programming/cfiles> ./geo2json < gpsdata.csv
data=[
'}, itude: 42.363400, longitude: -71.098465, info: 'Speed = 21
'}, itude: 42.363327, longitude: -71.097588, info: 'Speed = 23
'}, itude: 42.363255, longitude: -71.096710, info: 'Speed = 17
'}, itude: 42.363182, longitude: -71.095833, info: 'Speed = 22
'}, itude: 42.363110, longitude: -71.094955, info: 'Speed = 14
'}, itude: 42.363037, longitude: -71.094078, info: 'Speed = 16
'}, itude: 42.362965, longitude: -71.093201, info: 'Speed = 18
'}, itude: 42.362892, longitude: -71.092323, info: 'Speed = 22
'}, itude: 42.362820, longitude: -71.091446, info: 'Speed = 17
'}, itude: 42.362747, longitude: -71.090569, info: 'Speed = 23
'}, itude: 42.362675, longitude: -71.089691, info: 'Speed = 14
'}, itude: 42.362602, longitude: -71.088814, info: 'Speed = 19
'}, itude: 42.362530, longitude: -71.087936, info: 'Speed = 16
'}, itude: 42.362457, longitude: -71.087059, info: 'Speed = 16
'}atitude: 42.362385, longitude: -71.086182, info: 'Speed = 21
]
我检查了在线勘误表,但没有看到任何相关内容。我正在使用Cygwin,但后来尝试了linux,两者都有相同的结果。
任何帮助或见解都将不胜感激!
答案 0 :(得分:3)
您的文件包含Windows风格的CRLF line endings,并且您的程序无法处理它们。本书的作者假设没有测试Windows风格的文本文件的Linux或Mac机器(LF换行)。结果是每行的回车(CR)字符仍然包含在字符串info
中,这会搞砸输出。
您可以通过
修改程序以扫描CR和LF字符scanf("%f, %f, %39[^\r\n]", &latitude, &longitude, info)
请注意\r
。
(你说你在Linux上试过这个,但我猜你用的是你在Windows上输入的CSV文件?)
答案 1 :(得分:1)
尝试更改
while (scanf("%f, %f, %39[^\n]", &latitude, &longitude, info) ==3) {
到
while (scanf("%f, %f, %39[^\n\r]", &latitude, &longitude, info) ==3) {
我认为您的输入文件中可能有返回(是否来自Windows框?)。