int型からString型へのキャスト
#include <stdio.h> #include <string> #include <iostream> using namespace std; int main(){ //次の2ステップで変換する // ① int 型から char 型への変換 int t= 10; char t_char[10]; //sprintf(t_char, "%d", t); sprintf_s(t_char, "%d", t); printf(t_char); // ② char 型から string 型への変換 string t_string = ""; t_string += t_char; cout << t_string << endl; }
「sprintf」を使用すると次のようなwarningが出るので、「sprintf_s」を使う
warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
以下昔のはなし
トロポリス法を用いた、カノニカル集団の計算(3次元)でファイルの出力時に、int型からString型へのキャストが必要である。
int rho_step, T_step, t-t_0
を利用して、ファイル名が「position(1-2-100).data」みたいな形で保存する場合を考える。
①ostringstream型変数(fname)を宣言する
②文字列を代入する(<<)
③String型変数(fname2)を宣言し、ostringstream型変数もメンバ関数(str())を用いて、String型文字列として代入する。
④String型文字列をメンバ関数(c_str())を用いてC言語のCHAR型の文字列へ変換し、ファイル名としてofstreamを利用しファイルを開く。
もっとスマートなやり方があれば教えてください。
#include <sstream> ・・・ std::ostringstream fname; fname << "data/position(" << rho_step <<"-" << T_step << "-" << t-t_0<< ").data"; string fname2 = fname.str(); ofstream fout_position; fout_position.open(fname2.c_str()); for(int n=0; n<N; n++){ fout_position << R[n][0] << " " << R[n][1]<< " " << R[n][2] << endl; } fout_position.close();
もっと昔は...
ostringstream型を知らなかったので、int型をCHAR型にsprintf関数を用いて代入し、String型変数に+演算子でキャストしていた。
char name1[10],name2[10]; string kk,kk0=""; kk = ""; kk0 = ""; sprintf(name1, "%d", T_step); sprintf(name2, "%d", ave); kk = kk0 + "position(" + name1 + "-" + name2 + quot;).data"; ofstream fout_position; fout_position.open(kk.c_str()); for(int n=0; n<N; n++){ fout_position << R[n][0] << " " << R[n][1] << " quot; << R[n][2] << endl; } fout_position.close();