C++控制台:解析 METAR 数据
C++ Console : Parsing METAR data
我正在开发我的第一个Web应用程序(天气可视化(,需要在后端使用一些轻量级的c ++。我正在使用wget下载原始文本,并使用c ++控制台来解析数据,然后它编写HTML。到目前为止,这很好用。
METAR基本上是来自站点的原始天气数据。(时间,日期,条件,温度等(。我目前使用的那个是:
2018/08/10 08:09
KBAZ 100809Z AUTO 00000KT 10SM BKN012 26/23 A3002 RMK AO2 T02610233
我已经能够将每组数据存储到不同的变量中。我正在看的问题集是上面的"26/23",这是以摄氏度为单位的温度和露点。
到目前为止,我有一个名为 tempAndDewpoint 的字符串,其中存储了"26/23"......我正在使用 substr(0,2( 在一个名为 temperature的新字符串中返回刚好温度。(因为第一个数字是温度(。这很好用。
我的问题是,如果温度低于 10,比如 9,会发生什么?我不能再使用子字符串(0,2(,因为这将返回"9/"作为当前温度。
我希望找到一些指导,对我来说不会太复杂,无法复制。我什至不确定如何命名这个问题,因为我不确定这个问题叫什么。肯定是常见的吧?
注意:METAR中的负温度以M为前缀。所以这些是有效的温度组:5/M2 或 M8/M12(负露点实际上是结冰点(。所以我不会在这里使用自定义解析器:
struct TTD {
short int t;
short int td;
bool parse(const char *tempAndDewpoint) {
const char *next;
t = parse_partial(tempAndDewpoint, &next);
if (*next != '/') return false;
td = parse_partial(next + 1, &next);
return (*next == ' ');
}
private:
static short int parse_partial(const char *beg, const char **next) {
bool neg = false;
short int val = 0;
if (*beg == 'M') {
neg = true;
beg += 1;
}
while (*beg >= '0' && *beg <= '9') {
val = val * 10 + (*beg - '0');
beg += 1;
}
*next = beg;
if (neg) val = -val;
return val;
}
};
简单的解决方案是根本不存储为字符串。将字符串拆分为两个独立的数字。如另一个答案中所述,您确实需要注意"M"是负数的前缀,但没有读取来手动解析数字:
int parseNum(const std::string& str)
{
size_t pos;
int num;
if (!str.empty() && str.front() == 'M')
{
num = -std::stoi(str.substr(1), &pos);
if (pos != str.size() - 1)
{
throw std::invalid_argument("invalid input");
}
}
else
{
num = std::stoi(str, &pos);
if (pos != str.size())
{
throw std::invalid_argument("invalid input");
}
}
return num;
}
size_t slash = tempAndDewpoint.find("/");
if (slash == std::string::npos)
{
throw std::invalid_argument("invalid input");
}
int temp = parseNum(tempAndDewpoint.substr(0, slash));
int dew = parseNum(tempAndDewpoint.substr(slash + 1));
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- C++控制台:解析 METAR 数据