我在C ++代码中使用迭代器来检索使用sqlite3语句读取的记录。我能够使用cout
将迭代器指向的内容显示到屏幕上。我如何将值分配给简单的float
或数组变量。
typedef vector<vector<string> > Records;
vector< vector<string> >::iterator iter_ii;
vector<string>::iterator iter_jj;
Records records = select_stmt("SELECT density FROM Ftable where PROG=2.0");
for(iter_ii=records.begin(); iter_ii!=records.end(); iter_ii++)
{
for(iter_jj=(*iter_ii).begin(); iter_jj!=(*iter_ii).end(); iter_jj++)
{
cout << *iter_jj << endl; //This works fine and data gets displayed!
//How do i store the data pointed to by *iter_jj in a simple float variable or array?
}
}
答案 0 :(得分:2)
C ++是类型安全的,因此您需要将字符串显式转换为所需的目标类型。
例如,对于float,您可以使用atof
:
float f = atof(iter_jj->c_str());
更方便的选择是Boost的lexical_cast
,它对支持从std::istream
提取的所有类型使用相同的语法:
float f = boost::lexical_cast<float>(*iter_jj);
请注意,如果字符串的内容无法以任何有意义的方式转换为float,则这两种方法都会以不同的方式失败。
答案 1 :(得分:0)
您真正的问题是如何将字符串转换为浮点数。这是一个解决方案。
float value;
stringstream ss(*iter_jj);
if (! (ss >> value))
{
ERROR failed to convert value
}
答案 2 :(得分:0)
如果你有C ++ 11兼容的编译器:
float x = stof(*iter_jj);
(显然x
可能是循环之外的变量)。
如果你没有C ++ 11:
stringstream ss(*iter_jj);
float x;
ss >> x;
答案 3 :(得分:0)
好吧,因为你正在使用:
std::vector<std::vector<std::string> > records;
这里的实际问题是:如何从std::string
对象中检索特定类型的数据。
好的方法是为此目的构建和使用std::istringstream
对象:
float f;
std::istringstream is(*iter_jj);
if (is >> f)
{
// handle successful retrieval...
}
不要忘记#include <sstream>
:)
答案 4 :(得分:0)
至于将*转换为字符串,在c ++ 11中,您可以通过调用静态方法to_string将整数/浮点数转换为字符串:string str = std::string::to_string(integer/* or float*/);
在c ++ 98中,你可以编写自己的to_string:
#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <string>
void format_aux(char* ptr, int size, const char* format, ...) {
va_list args;
va_start(args, format);
vsnprintf(ptr, size, format, args);
va_end(args);
}
#undef TO_STRING__GEN
#define TO_STRING__GEN(type, arg, size) \
std::string \
to_string(type val) { \
const int sz = size; \
char buf[sz]; \
format_aux(buf, sz, arg, val); \
return std::string(buf); \
}
TO_STRING__GEN(int, "%d", 4*sizeof(int))
TO_STRING__GEN(unsigned int, "%u", 4*sizeof(unsigned int))
TO_STRING__GEN(long, "%ld", 4*sizeof(long))
TO_STRING__GEN(unsigned long, "%lu", 4*sizeof(unsigned long))
TO_STRING__GEN(float, "%f", (std::numeric_limits<float>::max_exponent10 + 20))
TO_STRING__GEN(double, "%f", (std::numeric_limits<float>::max_exponent10 + 20))
#undef TO_STRING__GEN
答案 5 :(得分:-1)
*iter_jj
会给你一个std::string
。为了将其存储为float
,它需要是字符串形式的浮点数(例如"1.23456"
),您需要调用其中一个strtof
函数族(http://en.cppreference.com/w/cpp/string/byte/strtof)