3

我在 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?
      }
   }
4

6 回答 6

2

C++ 是类型安全的,因此您需要将字符串显式转换为所需的目标类型。

例如,对于浮动,您可以使用atof

float f = atof(iter_jj->c_str());

一个更方便的替代方法是 Boost's lexical_cast,它对所有支持从 提取的类型使用相同的语法std::istream

float f = boost::lexical_cast<float>(*iter_jj);

请注意,如果字符串的内容无法以任何有意义的方式转换为浮点数,这两种方法都可能以不同的方式失败。

于 2013-09-18T15:31:20.873 回答
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
于 2013-09-18T15:52:52.487 回答
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>:)

于 2013-09-18T15:35:22.190 回答
0

您真正的问题是如何将字符串转换为浮点数。这是一种解决方案。

float value;
stringstream ss(*iter_jj);
if (! (ss >> value))
{
    ERROR failed to convert value
}
于 2013-09-18T15:32:32.890 回答
0

如果你有 C++11 兼容的编译器:

float x = stof(*iter_jj);

(显然x可能是循环外的变量)。

如果您没有 C++11:

stringstream ss(*iter_jj);
float x;
ss >> x;
于 2013-09-18T15:32:55.917 回答
-1

*iter_jj会给你一个std::string。为了将其存储为float,它需要是字符串形式的浮点数(例如"1.23456"),并且您需要调用strtof函数系列之一(http://en.cppreference.com/w/cpp/字符串/字节/strtof )

于 2013-09-18T15:31:32.720 回答