3

C++ コードで反復子を使用して、sqlite3 ステートメントを使用して読み取ったレコードを取得しています。を使用して、イテレータが指す内容を画面に表示できますcoutfloat値を単純変数または配列変数に割り当てるにはどうすればよいですか。

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 のlexical_castです。これは、 からの抽出をサポートするすべての型に対して同じ構文で動作しますstd::istream

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

文字列の内容を意味のある方法で float に変換できない場合、これらは両方とも異なる方法で失敗する可能性があることに注意してください。

于 2013-09-18T15:31:20.873 に答える
0

あなたの本当の問題は、文字列をフロートに変換する方法です。これが1つの解決策です。

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"いずれかを呼び出す必要があります ( http://en.cppreference.com/w/cpp/文字列/バイト/strtof )strtof

于 2013-09-18T15:31:32.720 に答える