我正在从文本文件中的列表中阅读时间,格式如下
我需要每隔一行进行分析,但是,当我读入它并尝试使用“std::stof()”函数将其转换为可用形式时,它在第一次转换时挂起(在4核i7的单核上需要10分钟以上)。
while (tf.is_open()) {
i++;
//std::cout << i << std::endl;
std::getline(tf, full);
std::stringstream tbreak;
tbreak.str(full);
int k = 0;
std::string milsec;
while (std::getline(tbreak, time, ' '))
{
// std::cout << k << std::endl;
if (k % 2 == 0) {
k++;
continue;
}
std::stringstream hrminsec;
hrminsec.str(time);
int m = 0;
while (std::getline(hrminsec, brokentime, ':'))
{
//std::cout << brokentime << std::endl;
if (m % 2 == 0)
{
m++;
continue;
}
//if (m % 2 == 1) time = brokentime;
//if (m % 3 == 2) milsec =brokentime;
if (brokentime == "time" || brokentime == "times")
{
m++;
continue;
}
//std::cout << brokentime << std::endl;
std::stringstream further;
int n = 0;
further.str(brokentime);
std::string temp;
while (std::getline(further, temp, '.'))
{
//std::cout << temp << std::endl;
if (n % 2 == 0) time = temp;
time.erase(0, time.find_first_not_of('0'));
//std::cout<<time <<std::endl;
if (n % 2 == 1)milsec = temp;
n++;
if (i % 2 == 0) {
float temp1 = std::stof(time);
std::cout << temp1 << std::endl;
float temp2 = std::stof(milsec);
temp1 = temp1 + 0.01*temp2;
int j = i - 2;
t[j] = temp1;
std::cout << j << std::endl;
}
}
m++;
}
k++;
}
这编译得很好,大部分子循环都是为了正确编译。如果有关系的话,我正在Windows 10上使用Visual Studio 15。
1条答案
按热度按时间guykilcj1#
这个“挂起”几乎肯定是
stof
抛出的一个(未处理的)异常,而且这个异常很可能是从输入中读取空字符串的结果,或者是一个看起来不像float
的字符串。很难说输入读数偏离的确切原因,但这正是您应该关注的地方。我可以看到您已经调试了
time
,但也检查了milsec
是否也被正确读取。*我自己也遇到过同样的问题。但是不要问,为什么偶尔的静默挂起是MSVC中"handling" unhandled exceptions的方式(也是在调试版本中)。